Программа курса:
Разбор задачи: Партитура в скобках
Предложенный нами код:
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 = "(()(()))"
- Инициализация:
stack = [0]. - Первая скобка
'(':stack = [0, 0].
- Вторая скобка
'(':stack = [0, 0, 0].
- Закрывающая скобка
')':- Удаляется верхний уровень:
last = 0. stack = [0, 1](результат"()"добавляется к родительскому уровню).
- Удаляется верхний уровень:
- Третья скобка
'(':stack = [0, 1, 0].
- Четвертая скобка
'(':stack = [0, 1, 0, 0].
- Закрывающая скобка
')':- Удаляется верхний уровень:
last = 0. stack = [0, 1, 1](результат"()"добавляется к родительскому уровню).
- Удаляется верхний уровень:
- Закрывающая скобка
')':- Удаляется верхний уровень:
last = 1. stack = [0, 3](результат2 * 1добавляется к родительскому уровню).
- Удаляется верхний уровень:
- Закрывающая скобка
')':- Удаляется верхний уровень:
last = 3. stack = [6](результат2 * 3добавляется к родительскому уровню).
- Удаляется верхний уровень:
Результат: 6.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии