括号匹配算法
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效,例:
输入:
() ->返回true输入:
()[]{} ->返回true输入:
(] ->返回false输入:
([)] ->返回false输入:
{[]} -> 返回true
示例表达的意思:
-
每个左括号
(,{,[都必须有对应的右括号),},]。 -
左括号必须按照正确的顺序闭合:那么最后一个打开的左括号必须最先闭合(这种情况是栈的典型特性)。
解题思路:
-
使用栈:
-
初始化一个空栈。
-
遍历字符串中的每个字符:
-
如果是左括号
(,{,[,将它压入栈中。 -
如果是右括号
),},],则检查栈是否为空:-
如果栈为空,表示没有对应的左括号,返回
false。 -
如果栈不为空,弹出栈顶元素,检查它是否与当前右括号匹配。如果匹配,则继续;否则,返回
false。
-
-
-
-
检查栈的状态:
-
遍历完字符串后,如果栈为空,说明所有的左括号都有匹配的右括号,返回
true。 -
如果栈不为空,说明有未匹配的左括号,返回
false。
-
代码实现:
1 function isValid(str){ 2 const map = { 3 "(":")", 4 "{":"}", 5 "[":"]", 6 } 7 const stack = []; 8 for(let s of str){ 9 //有值说明这是一个左括号 10 if(map[s]){ 11 stack.push(s); 12 } 13 //说明是一个右括号 14 else{ 15 //没有对应的左括号 16 if(stack.length === 0) return false; 17 const lastEle = stack.pop(); 18 // 如果栈顶元素的映射表右值跟当前元素不一样,返回 false 19 if(map[lastEle]!==s) return false; 20 } 21 } 22 //匹配时,栈顶元素依次被弹出,因此栈为空时,说明都匹配 23 return stack.length === 0; 24 } 25 console.log(isValid("()")); 26 console.log(isValid("(]")); 27 console.log(isValid("({[]})"));

浙公网安备 33010602011771号