Программа курса:

1.1 - Часть 1 1.2 - Часть 2 1.3 - Часть 3 1.4 - Часть 4 1.5 - Часть 5 1.6 - Часть 6 1.7 - Часть 7 1.8 - Часть 8 1.9 - Часть 9 1.10 - Часть 10 1.11 - Часть 11 1.12 - Часть 12
2.1 - Часть 1 2.2 - Часть 2 2.3 - Часть 3 2.4 - Часть 4 2.5 - Часть 5 2.6 - Часть 6
3.1 - Часть 1

Разбор задачи: Допустимые скобки

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

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 = "()"

  1. Инициализация: Стек пуст: stack = [].
  2. Первая скобка ( — открывающая, добавляется в стек: stack = ['('].
  3. Вторая скобка ) — закрывающая. Из стека извлекается верхний элемент: top_element = '('.
    • Пара ) и ( совпадает, стек очищается: stack = [].
  4. Стек пуст, строка корректна. Результат: True.

Пример 2: s = "()[]{}"

  1. Инициализация: Стек пуст: stack = [].
  2. Первая скобка ( — открывающая, добавляется в стек: stack = ['('].
  3. Вторая скобка ) — закрывающая. Из стека извлекается (, пара совпадает: stack = [].
  4. Третья скобка [ — открывающая, добавляется в стек: stack = ['['].
  5. Четвертая скобка ] — закрывающая. Из стека извлекается [, пара совпадает: stack = [].
  6. Пятая скобка { — открывающая, добавляется в стек: stack = ['{'].
  7. Шестая скобка } — закрывающая. Из стека извлекается {, пара совпадает: stack = [].
  8. Все скобки обработаны, стек пуст. Результат: True.

Пример 3: s = "(]"

  1. Инициализация: Стек пуст: stack = [].
  2. Первая скобка ( — открывающая, добавляется в стек: stack = ['('].
  3. Вторая скобка ] — закрывающая. Из стека извлекается (, но пара ] и ( не совпадает.
  4. Возвращаем False, строка некорректна.

 

Перейти к следующему шагу

Возникли вопросы при прочтении лекции? Задайте вопрос в комментариях

Комментарии