Программа курса:
Разбор задачи: Декодирование строки
Предложенный нами код решения:
def decodeString(s: str) -> str:
"""
:type s: str
:rtype: str
"""
stack = []
current_string = ""
current_number = 0
for char in s:
if char.isdigit():
current_number = current_number * 10 + int(char)
elif char == '[':
stack.append((current_string, current_number))
current_string, current_number = "", 0
elif char == ']':
prev_string, number = stack.pop()
current_string = prev_string + current_string * number
else:
current_string += char
return current_string1. Инициализация переменных
stack = []
current_string = ""
current_number = 0Здесь мы определяем:
stack: стек для хранения промежуточных строк и чисел (вложенные уровни декодирования).current_string: текущая собираемая строка.current_number: число, определяющее количество повторений строки.
2. Обход строки s
for char in s:Мы перебираем каждый символ строки s.
3. Обработка цифр
if char.isdigit():
current_number = current_number * 10 + int(char)Если текущий символ — цифра, мы обновляем current_number, чтобы учитывать многоразрядные числа. Например:
- Для
12[a]сначала обрабатывается1, затем2, иcurrent_numberстановится12.
4. Обработка символа [
elif char == '[':
stack.append((current_string, current_number))
current_string, current_number = "", 0Когда встречается [, это означает начало нового вложенного уровня. Мы сохраняем текущую строку и число в стек, а затем сбрасываем current_string и current_number.
Пример:
- При разборе
2[abc], после обработки2[:stack = [("", 2)]current_string = ""current_number = 0
5. Обработка символа ]
elif char == ']':
prev_string, number = stack.pop()
current_string = prev_string + current_string * numberКогда встречается ], это означает конец вложенного уровня. Мы извлекаем из стека предыдущую строку и число, а затем добавляем повторенную текущую строку.
Пример:
- Для
2[abc], после обработки]:prev_string = ""number = 2current_string = "abc" * 2 = "abcabc"
6. Обработка букв
else:
current_string += charЕсли текущий символ — буква, мы добавляем его к current_string.
Пример:
- При разборе
a2[b], после обработкиa:current_string = "a"
7. Возврат результата
return current_stringПосле обработки всей строки мы возвращаем результат.
Пример разбора строки 3[a2[c]]
- Начало обработки:
Инициализация:stack = [],current_string = "",current_number = 0. - Символ
3:current_number = 3.
- Символ
[:- Сохраняем в стек:
stack = [("", 3)]. - Сброс:
current_string = "",current_number = 0.
- Сохраняем в стек:
- Символ
a:current_string = "a".
- Символ
2:current_number = 2.
- Символ
[:- Сохраняем в стек:
stack = [("", 3), ("a", 2)]. - Сброс:
current_string = "",current_number = 0.
- Сохраняем в стек:
- Символ
c:current_string = "c".
- Символ
]:- Извлекаем из стека:
prev_string = "a",number = 2. - Обновляем:
current_string = "a" + "c" * 2 = "acc".
- Извлекаем из стека:
- Символ
]:- Извлекаем из стека:
prev_string = "",number = 3. - Обновляем:
current_string = "" + "acc" * 3 = "accaccacc".
- Извлекаем из стека:
- Возврат результата:
- Итог:
"accaccacc".
- Итог:
Ключевые моменты решения
- Использование стека:
- Позволяет эффективно обрабатывать вложенные уровни декодирования.
- Постепенная сборка строки:
- Строка строится по мере обработки символов.
- Учет многоразрядных чисел:
- Умножение
current_number = current_number * 10 + int(char).
- Умножение
Такое решение позволяет корректно обрабатывать строки с любым уровнем вложенности и сложностью.