← Назад к вопросам
Проверка скобок
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
}
Как работает
- Открывающие скобки добавляем в стек
- Для закрывающих скобок проверяем соответствие вершине стека
- Если совпадает - удаляем из стека
- В конце стек должен быть пуст
Сложность
- Время: O(n) - один проход
- Память: O(n) - максимум все открывающие в стеке
Примеры
- "()" -> true
- "()[]{}" -> true
- "(]" -> false
- "([)]" -> false
- "{[]}" -> true