Рекурсивно найти все подстроки заданной строки в Python

Данная строка "lion" должна получить следующий вывод подстрок, [«ion», «lin», «in», «io», «li», «on», «лев»]

Это то, что у меня есть до сих пор,

def Substring(n):
   sub = [n]
   if len(n) > 2:
       sub.extend(Substring(n[1:]))
       sub.extend(Substring(n[:-1]))
   return list(sub)

мой текущий вывод: ['lion', 'ion', 'on', 'io', 'lio', 'io', 'li']

Мне не хватает подстрок «lin» и «in», и мне не должно быть «lio».

Я не мог понять, нужен ли мне другой метод или мне нужны дополнительные инструкции?

Почему lio недействителен?

Farhan.K 25.10.2018 12:33

Почему в выводе нет «lon»? А как насчет «lo» и «ln»?

Aran-Fey 25.10.2018 12:35

lion не имеет подстроки lin, in или lon. Это не подстрока, это комбинация

Amir Rasulov 25.10.2018 12:40

Я написал ответ, предполагая, что это были просто «все возможные подстроки», не прочитав достаточно внимательно ... ваше задание выяснить, каков фактический алгоритм, или вы просто не предоставили нам полный текст задания?

kungphu 25.10.2018 12:50

Назначение - написать функцию, которая принимает строковый аргумент и возвращает подстроки. «lo» не учитывается, так как нет пути подслов от lion к lo.

Z.Ken 25.10.2018 12:54

Если это так, оба ответа верны (я восстановил свой), и в вашем вопросе есть хотя бы одна проблема. Ваш пример правильного вывода не должен содержать «lin» или «in», поскольку они не являются подстроками «lion». Вы также должны прояснить, что рекурсия является обязательным требованием.

kungphu 26.10.2018 01:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
1 083
1

Ответы 1

Для этого есть однострочный файл, который не требует itertools. В зависимости от того, к чему вы привыкли, он может быть более или менее разборчивым.

tuple(s[i:i+j+1] for i in range(len(s)) for j in range(len(s)-i))
# ('l', 'li', 'lio', 'lion', 'i', 'io', 'ion', 'o', 'on', 'n')

Обратите внимание, что отливка tuple предназначена только для печати; без него Python предоставит вам генератор, который будет намного эффективнее, если вы будете его повторять.

Для подстрок длиной 2 и более:

tuple(s[i:i+j+1] for i in range(len(s)) for j in range(1, len(s)-i))
# ('li', 'lio', 'lion', 'io', 'ion', 'on')

Другие вопросы по теме