Разбор задачи: Партитура в скобках

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

 def scoreOfParentheses(s: str) -> int:
    stack = [0]  # Стек для хранения промежуточных значений

    for char in s:
        if char == '(':
            stack.append(0)  # Открывающая скобка добавляет новый уровень
        else:
            last = stack.pop()  # Закрывающая скобка завершает текущий уровень
            stack[-1] += max(2 * last, 1)  # Если last = 0, то это "()"

    return stack[0]  # Финальная оценка строки находится на вершине стека

Данная задача решена с использованием стека для обработки строк с балансированными скобками. Ниже представлен детальный разбор каждого фрагмента кода.

Объявление функции

def scoreOfParentheses(s: str) -> int:
    stack = [0]  # Стек для хранения промежуточных значений

Функция принимает строку s, состоящую только из символов '(' и ')'. В начале создается стек stack и инициализируется значением [0]. Это базовый уровень, который будет содержать итоговую сумму.


Основной цикл

for char in s:
    if char == '(':
        stack.append(0)  # Открывающая скобка добавляет новый уровень

Этот фрагмент обрабатывает символы строки:

  • Если встречается открывающая скобка '(', в стек добавляется 0. Это создает новый уровень, который позже будет заполнен вычисленными значениями, если внутри окажутся вложенные скобки.

Обработка закрывающей скобки

    else:
        last = stack.pop()  # Закрывающая скобка завершает текущий уровень
        stack[-1] += max(2 * last, 1)  # Если last = 0, то это "()"
  • Если встречается закрывающая скобка ')', происходит завершение текущего уровня. Верхний элемент удаляется из стека (stack.pop()), так как вложенная структура скобок завершилась.
  • Затем вычисляется значение для текущего уровня:
    • Если удаленный элемент last равен 0, значит, это простая пара скобок "()", и ее значение равно 1.
    • В противном случае вложенные структуры уже имеют значение, и их результат удваивается (2 * last).
  • Результат добавляется к предыдущему уровню стека (stack[-1]), объединяя текущий результат с родительским уровнем.

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

return stack[0]  # Финальная оценка строки находится на вершине стека

В конце работы цикла в стеке остается только один элемент — итоговая оценка всей строки. Этот элемент возвращается как результат.


Пошаговый пример работы

Пример: s = "(()(()))"

  1. Инициализация: stack = [0].
  2. Первая скобка '(':
    • stack = [0, 0].
  3. Вторая скобка '(':
    • stack = [0, 0, 0].
  4. Закрывающая скобка ')':
    • Удаляется верхний уровень: last = 0.
    • stack = [0, 1] (результат "()" добавляется к родительскому уровню).
  5. Третья скобка '(':
    • stack = [0, 1, 0].
  6. Четвертая скобка '(':
    • stack = [0, 1, 0, 0].
  7. Закрывающая скобка ')':
    • Удаляется верхний уровень: last = 0.
    • stack = [0, 1, 1] (результат "()" добавляется к родительскому уровню).
  8. Закрывающая скобка ')':
    • Удаляется верхний уровень: last = 1.
    • stack = [0, 3] (результат 2 * 1 добавляется к родительскому уровню).
  9. Закрывающая скобка ')':
    • Удаляется верхний уровень: last = 3.
    • stack = [6] (результат 2 * 3 добавляется к родительскому уровню).

Результат: 6.

 



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