Программа курса:
Разбор задачи: Допустимые скобки
Предложенный нами код решения:
def isvalid(s):
# Создаем словарь для пар открывающих и закрывающих скобок
bracket_map = {')': '(', '}': '{', ']': '['}
stack = []
# Проходим по каждому символу в строке
for char in s:
# Если символ - закрывающая скобка
if char in bracket_map:
# Извлекаем верхний элемент стека (или '#' если стек пуст)
top_element = stack.pop() if stack else '#'
# Если верхний элемент не соответствует открывающей скобке
if bracket_map[char] != top_element:
return False
else:
# Если символ - открывающая скобка, добавляем в стек
stack.append(char)
# Если стек пуст в конце, строка корректна
return not stack
Основная идея
Мы используем стек для проверки корректности расположения скобок. Стек помогает обрабатывать ситуацию, когда каждая открывающая скобка должна быть закрыта в правильном порядке.
Код решения
1. Словарь для пар скобок
bracket_map = {')': '(', '}': '{', ']': '['}
Мы создаем словарь, в котором закрывающим скобкам сопоставлены соответствующие открывающие. Это позволяет быстро находить пары скобок.
2. Инициализация стека
stack = []
Стек используется для хранения открывающих скобок, которые еще не закрыты.
3. Итерация по строке
for char in s:
Мы проходим по каждому символу строки s
.
4. Обработка закрывающих скобок
if char in bracket_map:
top_element = stack.pop() if stack else '#'
if bracket_map[char] != top_element:
return False
Если текущий символ — закрывающая скобка:
- Мы пытаемся извлечь верхний элемент из стека. Если стек пуст, вместо этого используем специальный символ
'#'
, чтобы предотвратить ошибку. - Сравниваем извлеченный элемент с ожидаемой открывающей скобкой (из словаря
bracket_map
). Если они не совпадают, строка некорректна, и мы возвращаемFalse
.
5. Обработка открывающих скобок
else:
stack.append(char)
Если символ — открывающая скобка, мы добавляем его в стек, чтобы позже проверить его закрытие.
6. Проверка стека в конце
return not stack
Если после обработки всех символов стек пуст, это означает, что все скобки были правильно закрыты. Если в стеке остались элементы, строка некорректна, так как есть незакрытые открывающие скобки.
Пример 1: s = "()"
- Инициализация: Стек пуст:
stack = []
. - Первая скобка
(
— открывающая, добавляется в стек:stack = ['(']
. - Вторая скобка
)
— закрывающая. Из стека извлекается верхний элемент:top_element = '('
.- Пара
)
и(
совпадает, стек очищается:stack = []
.
- Пара
- Стек пуст, строка корректна. Результат:
True
.
Пример 2: s = "()[]{}"
- Инициализация: Стек пуст:
stack = []
. - Первая скобка
(
— открывающая, добавляется в стек:stack = ['(']
. - Вторая скобка
)
— закрывающая. Из стека извлекается(
, пара совпадает:stack = []
. - Третья скобка
[
— открывающая, добавляется в стек:stack = ['[']
. - Четвертая скобка
]
— закрывающая. Из стека извлекается[
, пара совпадает:stack = []
. - Пятая скобка
{
— открывающая, добавляется в стек:stack = ['{']
. - Шестая скобка
}
— закрывающая. Из стека извлекается{
, пара совпадает:stack = []
. - Все скобки обработаны, стек пуст. Результат:
True
.
Пример 3: s = "(]"
- Инициализация: Стек пуст:
stack = []
. - Первая скобка
(
— открывающая, добавляется в стек:stack = ['(']
. - Вторая скобка
]
— закрывающая. Из стека извлекается(
, но пара]
и(
не совпадает. - Возвращаем
False
, строка некорректна.