Така че имам стека и иглата:
stack = 'lllolollololollllolol'
needle = 'lol'
Ако премахвам едно needle
от stack
всеки път, с правилния ред, stack
може да бъде изчистено, така че да е празно в края. Например, всеки път lol
с удебелен шрифт се премахва (забележете, че друг needle
може да бъде допълнително създаден след премахването):
лололололололлолол
лолололололохаха
лелололололо
лололололл
лоллолол
лхахаол
хаха
изчистване
За да намеря маршрут като по-горе, единственият начин, който измислих с помощта на Python, е да използвам regex (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.