← Назад к вопросам
Как решить задачу Valid Parentheses с LeetCode?
1.0 Junior🔥 151 комментариев
#Коллекции и структуры данных
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Алгоритмическое решение задачи Valid Parentheses
Задача (LeetCode #20) проверяет корректность скобочной последовательности. Необходимо определить, правильно ли расставлены скобки трёх типов: круглые (), квадратные [] и фигурные {}.
Ключевая идея решения
Основной подход использует стек (Stack) для отслеживания открывающих скобок. Алгоритм последовательно обрабатывает каждый символ строки и проверяет соответствие скобок по принципу LIFO (Last-In-First-Out).
Детальный алгоритм
- Инициализация стека для хранения открывающих скобок
- Обход строки посимвольно:
- При встрече открывающей скобки
(,[,{- помещаем её в стек - При встрече закрывающей скобки
),],}:
- При встрече открывающей скобки
- Если стек пуст - последовательность некорректна
- Извлекаем последнюю открывающую скобку из стека
- Проверяем соответствие типов скобок
- Финальная проверка - стек должен быть пустым
Реализация на Kotlin
class Solution {
fun isValid(s: String): Boolean {
val stack = ArrayDeque<Char>()
val pairs = mapOf(
')' to '(',
']' to '[',
'}' to '{'
)
for (char in s) {
when (char) {
'(', '[', '{' -> stack.addLast(char)
')', ']', '}' -> {
if (stack.isEmpty()) return false
val lastOpen = stack.removeLast()
if (lastOpen != pairs[char]) return false
}
}
}
return stack.isEmpty()
}
}
Реализация на Java
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
Map<Character, Character> pairs = Map.of(
')', '(',
']', '[',
'}', '{'
);
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
if (stack.isEmpty()) return false;
char lastOpen = stack.pop();
if (lastOpen != pairs.get(c)) return false;
}
}
return stack.isEmpty();
}
}
Анализ сложности
- Временная сложность: O(n), где n - длина строки. Каждая операция со стеком выполняется за O(1)
- Пространственная сложность: O(n) в худшем случае, когда все скобки открывающие
Краевые случаи и тестирование
Важно проверять:
- Пустую строку - должна считаться валидной
- Строку с нечётной длиной - автоматически невалидна
- Вложенные скобки разного типа
- Неправильную последовательность закрывающих скобок
- Несбалансированное количество открывающих и закрывающих скобок
Примеры работы алгоритма
Валидные последовательности:
"()[]{}"→true"{[]}"→true"([{}])"→true
Невалидные последовательности:
"(]"→false"([)]"→false"((("→false
Практическое применение
Это классическая задача на стек, часто встречающаяся в:
- Проверке синтаксиса в компиляторах
- Анализе JSON/XML структур
- Реализации калькуляторов и парсеров выражений
- Проверке корректности HTML/JSX разметки
Решение демонстрирует понимание базовых структур данных и умение применять их для обработки последовательностей с учётом вложенности и порядка элементов.