Рубрики
Без рубрики

Подробнее Python Strings: Можете ли вы решить эту проблему * более сложной строки?

<< Неделя 15: Бинарные деревья | Просмотр решения на GitHub | Неделя 17: knaxack >> (изображение: … Теги с Python, CodeNewie, начинающими, компьютерными науками.

<< Неделя 15: Бинарные деревья |. Просмотр решения на GitHub |. Неделя 17: knaxack >>

(Изображение: Turbosquid.com)

Это проблема, которая появляется сейчас и снова на различных повседневных платформах кодирования, таких как Эта проблема на HackeRrank : Учитывая строку, найдите все возможные комбинации букв в этой строке. Это иногда называют «подстрадателями» или, если возвращается серия списков, «Наборы питания. ” Давайте посмотрим на один пример:

# Given a string, return a sorted list of all 
# unique possible substrings.

Например, строка 'abc' даст список [«А», «ab», «abc», «AC», «B», «BC», «C»] Отказ

Давайте начнем с определения нашего метода. Это берет в строке, которую мы позвоним слово Отказ

def find_substrings(word):

Далее давайте подумаем о нашем подходе. Нам понадобится структура данных для хранения всех наших новых подстроков. В конце концов, нам придется вернуть список, но помните, что он сказал в подсказке: Уникальный подстроки. Так что, если у нас есть строка 'aa' Мы не хотим добавлять «А» дважды. Какая структура данных делает этот звук? Если слово Установить приходит на ум, ты прав! Мы накрыли наборы в этом блоге ранее , но для Recap это структура данных, которая хранит ряд уникальных значений.

Чтобы сделать новый набор, мы просто инициируем Установить Объект в Python.

def find_substrings(word):
  s = set()

Теперь мы достигаем следующего этапа реализации. Как мы собираемся добавить каждую подстроку? Скажем, у нас есть строка 'abc' Отказ Мы можем начать с первой буквы «А» и добавьте его к набору. Далее мы хотим добавить письмо 'B' наряду с 'B' объединены на все ранее в наборе, а именно «А» сделать 'ab' Отказ Два правила в каждой итерации:

  1. Добавьте новое письмо. (например 'B' )
  2. Добавьте новое письмо составляемого с каждой предыдущей подстрокой (например, ‘ ab ‘)

Однако мы можем упростить это в одно правило. Если мы добавим пустую строку к набору, нам нужно только № 2, так как # 1 покрывается, добавляя новое письмо в пустую строку. В целом, это подстроки, которые будут добавлены для каждой итерации:

0 ‘a’ a { ” }
1 ‘b’ ‘ab’ b { ”, ‘a’ }
2 ‘C’ AC ” BC ” ABC ‘ c {”, ‘a’, ‘b’, ‘ab’}
Результат: {”, ‘a’, ‘b’, ‘ab’, ‘c’, ‘ac’, ‘bc’, ‘abc’}

Давайте пойдем о реализации этого в коде. Как мы устанавливаем ранее, нам нужно начать с пустой строки в нашем наборе. Давайте сделаем это.

def find_substrings(word):
  s = set()
  s.add('')

Далее нам нужно определить нашу итерацию. Мы хотим посмотреть на каждую букву в строке. Достаточно просто, мы используем для петля.

  for letter in word:

Хорошо, так и для каждой буквы в Слове, нам нужно верить через все в комплекте и добавлять новые комбинации с этим письмом. Однако, если мы попытаемся изменить набор, пока мы переживаем его, мы получим ошибку. Итак, нам придется сделать копию этого.

  for letter in word:
    new_set = s.copy()

Помните, что мы должны использовать Python .copy () Метод, или еще мы просто создадим ссылку на оригинальный набор. Таким образом, у нас есть неизмененная копия для обозначения.

Далее мы петлю через элементы в неизменной копии. Для каждой подстроки мы хотим добавить текущую букву, а затем нажать на набор.

  for letter in word:
    new_set = s.copy()
    for substr in new_set:
      s.add(substr + letter)

Наконец, у нас есть наши подстроки. Мы просто должны сделать некоторые форматирование, чтобы получить его, как правильно хочет. Прежде всего, у нас есть этот дополнительный пустой строковый элемент в наборе. Давайте удалим это.

  s.remove('')

Простой. Далее, как вы помните, мы хотим вернуть список, а не набор. Как мы бросаем что-то в список? Мы повторяем каждый из его содержания и оберните его в некоторых квадратных скобках, как так:

  s = [letter for letter in s]

Мы можем просто переназначить его на S Так как нам не нужна эта переменная для чего-либо еще. Наконец, мы хотим его отсортировать. Просто позвоните .sort () Метод в нашем списке.

s.sort()

И вот и все, что осталось, это вернуть S Отказ Всего:

def find_substrings(word):
s = set()
s.add('')
for letter in word:
new_set = s.copy()
for substr in new_set:
s.add(substr + letter)
s.remove('')
s = [letter for letter in s]
s.sort()
return s

Попробуйте это

Позвоните по методу find_substrings () На строке 'abc' и напечатайте результат. Мы должны получить:

[«А», «ab», «ABC», «AC», «B», «BC», ‘C’]

Более длинные слова также будут работать. «Абракадабра» даст нам:

[«А», «АА», «ААА», «АААА», «ААААА», «ААААБ»

Вы получаете идею. Дело в том, что «А» появляется только один раз, и список сортируется в алфавитном порядке.

Дальнейшее чтение: оптимизация

Это было концептуально простую решение, и реализация более оптимальных решений не будет охвачена в этой статье. Но как мы можем пойти об этом?

Вместо того, чтобы использовать набор, сохраните окончательный вывод в виде списка и вставьте только новые строки в отсортированный заказ. Всякий раз, когда мы находим новую подстроку, чтобы добавить к нему, мы используем Бинарный поиск выяснить, где он должен быть добавлен. Если строка уже существует в этой точке, нет необходимости добавлять его снова. Это экономит нас от o (n log n) время выполнения работает Сортировать () Отказ

Это одна из тех концепций, которые появляются в разных формах в разных проблемах кодирования. Я надеюсь, что это добавило в ваш инструмент для знаний кодирования, и вы будете подготовлены в следующий раз, когда он придет!

<< Неделя 15: Бинарные деревья |. Просмотр решения на GitHub |. Неделя 17: knaxack >>

Sheamus Heikkila ранее преподавательский помощник на Генеральной Ассамблее. Этот блог не связан с GA.

Оригинал: “https://dev.to/pythonwb/more-python-strings-can-you-solve-this-more-difficult-string-problem-2lfj”