Программа курса:
Разбор задачи: Удаление внешних скобок
Предложенный нами код решения:
def removeOuterParentheses(s):
"""
Удаляет внешние скобки из каждой примитивной строки в заданной валидной строке скобок.
:param s: строка, представляющая валидную строку скобок
:return: строка без внешних скобок у каждой примитивной строки
"""
result = []
balance = 0
for char in s:
if char == '(':
if balance > 0:
result.append(char)
balance += 1
elif char == ')':
balance -= 1
if balance > 0:
result.append(char)
return ''.join(result)
Логика решения:
- Инициализация переменных:
result— список, в который будут добавляться символы строкиs, не являющиеся внешними скобками.balance— переменная для отслеживания баланса скобок. Показывает текущий уровень вложенности.
- Итерация по строке:
- Проход осуществляется по каждому символу строки
s.
- Проход осуществляется по каждому символу строки
- Обработка открывающей скобки
'(':- Если баланс (
balance) больше 0, это значит, что текущая скобка не является внешней. Мы добавляем её в списокresult. - Увеличиваем баланс на 1, так как встретилась открывающая скобка.
- Если баланс (
- Обработка закрывающей скобки
')':- Уменьшаем баланс на 1, так как встретилась закрывающая скобка.
- Если баланс после уменьшения больше 0, это значит, что текущая закрывающая скобка не является внешней. Мы добавляем её в список
result.
- Формирование результата:
- После обработки всех символов список
resultобъединяется в строку с помощью методаjoinи возвращается.
- После обработки всех символов список
Пошаговый пример работы:
Рассмотрим строку s = "(()())(())":
- Инициализация:
result = []balance = 0
- Итерация по символам строки:
- 1-й символ
'(':balance = 0, скобка внешняя, пропускаем её.- Увеличиваем
balance:balance = 1.
- 2-й символ
'(':balance = 1, добавляем вresult:result = ['('].- Увеличиваем
balance:balance = 2.
- 3-й символ
')':- Уменьшаем
balance:balance = 1. - Добавляем в
result:result = ['(', ')'].
- Уменьшаем
- 4-й символ
')':- Уменьшаем
balance:balance = 0, скобка внешняя, пропускаем её.
- Уменьшаем
- 5-й символ
'(':balance = 0, скобка внешняя, пропускаем её.- Увеличиваем
balance:balance = 1.
- 6-й символ
'(':balance = 1, добавляем вresult:result = ['(', ')', '('].- Увеличиваем
balance:balance = 2.
- 7-й символ
')':- Уменьшаем
balance:balance = 1. - Добавляем в
result:result = ['(', ')', '(', ')'].
- Уменьшаем
- 8-й символ
')':- Уменьшаем
balance:balance = 0, скобка внешняя, пропускаем её.
- Уменьшаем
- 1-й символ
- Формирование результата:
- Список
resultсодержит['(', ')', '(', ')'], объединяем в строку:"()()".
- Список
Итог:
Для входной строки s = "(()())(())" результат: "()()".
Решение аккуратно обрабатывает каждую скобку, определяя, является ли она внешней или нет, и удаляет только внешние скобки, сохраняя структуру вложенных подстрок.
xsnm
,Для входной строки
s = "(()())(())"результат:"()()".xsnm
,Рассмотрим строку
s = "(()())(())":xsnm
,Добрый.
Для входной строки
s = "(()())(())"результат:"()()"Ваш код выдаёт результат "()()()"
Пример 1:
Ввод:
s = "(()())(())"Вывод:
"()()()"Пояснение:
Строка
"(()())(())"состоит из примитивных строк"(()())"и"(())".После удаления внешних скобок:
"()" + "()" = "()()()".Второе.
"(()())(())"— это комбинация двух примитивных строк:"(()())"и"(())"Из описания задания:
Примитивная валидная строка скобок — это непустая валидная строка, которую нельзя разделить на две непустые валидные строки скобок.
Вопрос сколько все токи скобок? и так далее по тексту.