Valid Parentheses - LeetCode
----- Условие ----- Проверить валидность скобок в строке: для каждой открывающей скобки в строке должна быть аналогичная закрывающая в определенном положении (с сохранением порядка).
‘[](){}’ - true, ‘[]{([])}’ - true, ‘]’ - false, ‘[{]}’ - false, ‘[](){’ - false.
----- Решение ----- Для решения необходимо пройтись в цикле по всей строке: если символ является открывающей скобкой, то он добавляется в стек, иначе (когда символ закрывающая скобка) из стека извлекается последний элемент и проверяется на соответствие ‘открывающая-закрывающая скобки’ с текущим. Стек позволяет хранить упорядоченные открывающие скобки, которые удаляются, когда встречаются соответствующие закрывающие.
Отдельные случаи: * если скобка закрывающая, а стек пустой, то соответствия этой скобке нет, вернуть false; * если цикл пройден, а стек не пустой, то есть скобки без соответствия, вернуть false.
Сложность по памяти O(n), так как каждый элемент строки может быть добавлен в стек, сложность по времени O(n).
----- Код ----- /** * @param {string} s * @return {boolean} */ const isValid = function(s) { const dict = { ‘}’: ‘{’, ‘]’: ‘[’, ‘)’: ‘(’, };
const openingBrackets = Object.values(dict); const stack = [];
for (const char of s) { if (openingBrackets.includes(char)) { stack.push(char); } else { if (!stack.length) return false; if (stack.pop() !== dict[char]) return false; } }
return !stack.length; };