Вот рекурсивное решение с использованием groupby
.Я оставил вам на усмотрение, какие символы вы хотите иметь возможность повторять (по умолчанию только гласные):
from itertools import groupby
def find_dub_strs(mystring):
grp = groupby(mystring)
seq = [(k, len(list(g)) >= 2) for k, g in grp]
allowed = ('aeioupt')
return rec_dubz('', seq, allowed=allowed)
def rec_dubz(prev, seq, allowed='aeiou'):
if not seq:
return [prev]
solutions = rec_dubz(prev + seq[0][0], seq[1:], allowed=allowed)
if seq[0][0] in allowed and seq[0][1]:
solutions += rec_dubz(prev + seq[0][0] * 2, seq[1:], allowed=allowed)
return solutions
Это действительно просто эвристически сокращенный поиск в глубину в вашем "пространстве решений".«из возможных слов.Эвристика заключается в том, что мы допускаем только одно повторение за раз, и только если это допустимая повторяемая буква.В конце вы должны получить 2 ** n слов, где n - это число раз, когда «разрешенный» символ был повторен в вашей строке.
>>> find_dub_strs('jeeeeeep')
['jep', 'jeep']
>>> find_dub_strs('jeeeeeeppp')
['jep', 'jepp', 'jeep', 'jeepp']
>>> find_dub_strs('jeeeeeeppphhhht')
['jepht', 'jeppht', 'jeepht', 'jeeppht']