#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