Для скобок разных типов нужен стек: открывающую кладём в него, закрывающую сравниваем с последней открытой. Некоторые ожидаемые результаты в условии противоречат правилам парности.
Валидация правильности размещения скобок разных типов
Для скобок разных типов нужен стек: открывающую кладём в него, закрывающую сравниваем с последней открытой. Некоторые ожидаемые результаты в условии противоречат правилам парности.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача состоит в реализации функции, которая определяет, корректно ли расставлены в строке три вида скобок:
- Круглые — ()
- Квадратные — []
- Фигурные — {} Функция должна вернуть
true, если все скобки открыты и закрыты в правильном порядке и вложены друг в друга согласно правилам парности, иначе —false.
function checkBrackets(str: string): boolean {
// code
}
// checkBrackets('(') === false
// checkBrackets(')') === true
// checkBrackets('[]') === false
// checkBrackets('[()]') === true
// checkBrackets('()[{}])' === true
// checkBrackets('(){[}') === false
Ответ
Для скобок разных типов нужен стек: открывающую кладём в него, закрывающую сравниваем с последней открытой. Некоторые ожидаемые результаты в условии противоречат правилам парности.
function checkBrackets(str: string): boolean {
const pairs: Record<string, string> = { ')': '(', ']': '[', '}': '{' };
const stack: string[] = [];
for (const ch of str) {
if ('([{'.includes(ch)) stack.push(ch);
else if (Object.hasOwn(pairs, ch) && stack.pop() !== pairs[ch]) return false;
}
return stack.length === 0;
}
Здесь прочие символы игнорируются. Корректные результаты: ')' → false, '[]' → true, '()[{}])' → false. Остальные примеры согласованы с условием. Время O(n), дополнительная память O(n).