<< Неделя 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'
Отказ Два правила в каждой итерации:
- Добавьте новое письмо. (например
'B'
) - Добавьте новое письмо составляемого с каждой предыдущей подстрокой (например, ‘
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”