Разбор задачи: Декодирование строки

Предложенный нами код решения:

 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_string

1. Инициализация переменных

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 = 2
    • current_string = "abc" * 2 = "abcabc"

6. Обработка букв

else:
    current_string += char

Если текущий символ — буква, мы добавляем его к current_string.

Пример:

  • При разборе a2[b], после обработки a:
    • current_string = "a"

7. Возврат результата

return current_string

После обработки всей строки мы возвращаем результат.


Пример разбора строки 3[a2[c]]

  1. Начало обработки:
    Инициализация: stack = [], current_string = "", current_number = 0.
  2. Символ 3:
    • current_number = 3.
  3. Символ [:
    • Сохраняем в стек: stack = [("", 3)].
    • Сброс: current_string = "", current_number = 0.
  4. Символ a:
    • current_string = "a".
  5. Символ 2:
    • current_number = 2.
  6. Символ [:
    • Сохраняем в стек: stack = [("", 3), ("a", 2)].
    • Сброс: current_string = "", current_number = 0.
  7. Символ c:
    • current_string = "c".
  8. Символ ]:
    • Извлекаем из стека: prev_string = "a", number = 2.
    • Обновляем: current_string = "a" + "c" * 2 = "acc".
  9. Символ ]:
    • Извлекаем из стека: prev_string = "", number = 3.
    • Обновляем: current_string = "" + "acc" * 3 = "accaccacc".
  10. Возврат результата:
    • Итог: "accaccacc".

Ключевые моменты решения

  1. Использование стека:
    • Позволяет эффективно обрабатывать вложенные уровни декодирования.
  2. Постепенная сборка строки:
    • Строка строится по мере обработки символов.
  3. Учет многоразрядных чисел:
    • Умножение current_number = current_number * 10 + int(char).

Такое решение позволяет корректно обрабатывать строки с любым уровнем вложенности и сложностью.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии