Вопрос проверяет умение строить алгоритм с ранним выходом и понимание инвариантов при однопроходной проверке.
Некорректность можно определить сразу, как только встречается закрывающая скобка, которой не соответствует последняя открывающая. Также ошибка есть, если закрывающая скобка встретилась, когда стек пуст. Эти случаи означают, что дальнейший разбор строки уже не исправит проблему. В конце проверки ещё одна причина некорректности — если стек не пуст.
Раннее обнаружение некорректности — это способность алгоритма завершиться до конца строки, как только становится ясно, что корректного результата быть не может.
Перед тем как формулировать условия ошибки, полезно держать в голове правило:
в стеке всегда лежат только незакрытые открывающие скобки в правильном порядке.
FalseЗакрывающая скобка при пустом стеке
Пример: ")..."
Причина: нечего закрывать
Тип закрывающей скобки не совпадает с последней открывающей
Пример: "([)]" при встрече ) последняя открытая — [
Причина: нарушена вложенность
def is_valid(s: str) -> bool:
stack = []
pairs = {')': '(', ']': '[', '}': '{'}
for ch in s:
if ch in pairs.values():
stack.append(ch)
elif ch in pairs:
if not stack:
return False
if stack.pop() != pairs[ch]:
return False
return not stack
Даже если ранних ошибок не было, строка некорректна, если остались незакрытые скобки.
Пример: "(()"
После прохода стек не пуст → False
Некорректность часто определяется “на лету” при обработке закрывающих скобок, а финальная проверка — пустой ли стек — закрывает случаи незавершённого закрытия.