является ли проблемой использование цикла while внутри цикла for? В частности, поскольку цикл for повторяется только вперед?

#python #loops

Вопрос:

Я отвечаю на следующий вопрос по литкоду: https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/

Вот простой пример;

 Input: s = "deeedbbcccbdaa", k = 3
Output: "aa"
Explanation: 
First delete "eee" and "ccc", get "ddbbbdaa"
Then delete "bbb", get "dddaa"
Finally delete "ddd", get "aa"
 

Вот мой код:

 def removeDuplicates(s: str, k: int) -> str:
    dup = [k * i for i in "qwertyuiopasdfghjklzxcvbnm"]
    dup_index = []
    nextt_s = ""

    for duplicates in dup:
        while duplicates in s:

            #identify index of the duplicated characters in the input 
            for index in range(s.index(duplicates), s.index(duplicates)   len(duplicates)):
                dup_index.append(index)

            for i, e in enumerate(s):
                if i not in dup_index:
                    nextt_s  = e
            s = nextt_s

    return s
 

По какой-то причине, когда я выполняю вышеописанное для ввода «deeedbbcccbdaa»; он застревает и сходит с ума, когда я print dup_index or nextt_s . Я думаю, что с петлей что-то не так.

Мое намерение while loop состоит в том, чтобы продолжать повторять ввод до тех пор, пока в нем не останется дублированных символов. И после каждой итерации я буду удалять дублированные символы, и новая строка будет называться next_s

Я вижу одну проблему с использованием цикла for, а затем цикла while в том виде, в каком он есть; в том, что после того, как исходный ввод будет сокращен, и скажем, что цикл for находится на «hhh», а сокращенная строка становится «bbbfjfdshf» ; тогда «bbb» никогда не будет достигнут снова, потому что цикл for движется только вперед.

Ответ №1:

 def removeDuplicates(s: str, k: int) -> str:
    dup = [k * i for i in "qwertyuiopasdfghjklzxcvbnm"]
    changes=True
    while changes:
        changes=False
        for duplicates in dup:
            while duplicates in s: 
                changes=True
                #s=s.replace(duplicates,"") or
                s=s[:s.index(duplicates)] s[s.index(duplicates) k:]
    return s
 

вы могли бы сделать это так.
найдите индекс дубликата и возьмите все символы слева и все символы с правой стороны строки (или используйте замену).
Поместите свой код в цикл до тех пор, пока один цикл не закончится без изменений в строке s