Заклинание из скобок

тема: Стек и очередь · уровень: базовый

Условие

В одной игре дверь в подземелье открывается заклинанием — строкой из скобок. Дверь принимает заклинание только если оно «аккуратно вложено»: каждая открывающая скобка когда‑то закрывается скобкой того же типа, и закрытия идут в правильном порядке.

Скобки бывают трёх видов: (), [], {}.

Определи, откроется ли дверь.

Формат ввода

Одна строка s, состоящая только из символов ( ) [ ] { }.

Формат вывода

Выведи YES, если строка является правильной скобочной последовательностью, иначе выведи NO.

Ограничения

Пример

Ввод:

([{}])

Вывод:

YES

Как решать — идея подхода

Приём: Стек

Главное слово здесь — вложенность. Если открыли (, потом [, то сначала нужно закрыть именно [, и только потом (. Значит, всегда важна последняя ещё не закрытая скобка. Для этого подходит стек — структура данных по правилу «последним пришёл, первым вышел».

Идём по строке слева направо:

Удобно завести соответствие закрывающей скобки её открывающей: ')': '(', ']': '[', '}': '{'.

Каждый символ добавляется в стек и удаляется из него не более одного раза, поэтому время работы — O(n), где n — длина строки. Память в худшем случае — O(n).

Частая ошибка: проверять только одинаковое число открывающих и закрывающих скобок. Например, ([)] имеет правильные количества, но неправильный порядок, поэтому это NO.

Решить задачу с автопроверкой на Python →

Куда дальше