← Назад к вопросам

Проверка скобок

2.0 Middle🔥 211 комментариев
#Основы Go

Условие

Дана строка, содержащая только символы (, ), {, }, [ и ]. Определите, является ли входная строка валидной.

Сигнатура

func isValid(s string) bool

Правила

  • Открывающие скобки должны закрываться скобками того же типа
  • Открывающие скобки должны закрываться в правильном порядке
  • Каждой закрывающей скобке соответствует открывающая того же типа

Примеры

Вход: "()" Выход: true

Вход: "()[]{}" Выход: true

Вход: "(]" Выход: false

Вход: "([)]" Выход: false

Вход: "{[]}" Выход: true

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Используем стек для отслеживания открывающих скобок. Алгоритм простой: открывающие скобки добавляем в стек, закрывающие - проверяем совпадение с вершиной.

Код

func isValid(s string) bool {
    stack := make([]rune, 0)
    pairs := map[rune]rune{')': '(', '}': '{', ']': '['}
    open := map[rune]bool{'(': true, '{': true, '[': true}
    
    for _, ch := range s {
        if open[ch] {
            stack = append(stack, ch)
        } else if len(stack) == 0 || stack[len(stack)-1] != pairs[ch] {
            return false
        } else {
            stack = stack[:len(stack)-1]
        }
    }
    
    return len(stack) == 0
}

Как работает

  1. Открывающие скобки добавляем в стек
  2. Для закрывающих скобок проверяем соответствие вершине стека
  3. Если совпадает - удаляем из стека
  4. В конце стек должен быть пуст

Сложность

  • Время: O(n) - один проход
  • Память: O(n) - максимум все открывающие в стеке

Примеры

  • "()" -> true
  • "()[]{}" -> true
  • "(]" -> false
  • "([)]" -> false
  • "{[]}" -> true
Проверка скобок | PrepBro