Итак, у меня есть стек и игла:
stack = 'lllolollololollllolol'
needle = 'lol'
Если я каждый раз удаляю один needle
из stack
в правильном порядке, stack
можно очистить, чтобы в конце он был пуст. Например, каждый раз lol
, выделенный жирным шрифтом, удаляется (обратите внимание, что после удаления может быть создан еще один needle
):
лллоллололлллллллллллллллллл
ллолололололлол
ллололлолололл
ллололололл
ллоллолол
ллолол
лол
очистить
Чтобы найти маршрут, как указано выше, единственный способ, который я придумал с помощью Python, — это использовать регулярное выражение (finditer), чтобы найти все needles
в stack
, и использовать рекурсию для изучения всех возможных комбинаций удаления, чтобы найти те, которые могут сделать stack
пустой. Но я знаю, что это совсем не эффективно.
Есть ли более эффективный способ найти хотя бы 1 способ удалить needle
, чтобы очистить stack
с помощью Python?
Я нашел эту тему: Рекурсивное удаление вхождений подстроки Но я не уверен, что это 100% применимо к моему случаю.
Спасибо!
Ниже приведен код, который я придумал (плохая сложность, которую я знаю..):
def answer(chunk, word):
if chunk.find(word) != -1:
occ = [m.start() for m in finditer('(?='+word+')', chunk)]
for o in occ:
new = chunk[:o] + chunk[o + len(word):]
answer(new, word)
else:
result.append(chunk)
result.sort()
return chunk
...
#So all the shortest "leftover stack" after the removal are stored in list
#"result". These include empty or non-empty outputs depending on how
#the removal was executed.