括号匹配算法

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效,例:
  • 输入:() -> 返回 true

  • 输入:()[]{} -> 返回 true

  • 输入:(] ->  返回 false

  • 输入:([)] -> 返回 false

  • 输入:{[]} -> 返回true

示例表达的意思:

  • 每个左括号(, {, [都必须有对应的右括号), }, ]

  • 左括号必须按照正确的顺序闭合:那么最后一个打开的左括号必须最先闭合(这种情况是栈的典型特性)。

解题思路:

  1. 使用栈

    • 初始化一个空栈。

    • 遍历字符串中的每个字符:

      • 如果是左括号(, {, [,将它压入栈中。

      • 如果是右括号), }, ],则检查栈是否为空:

        • 如果栈为空,表示没有对应的左括号,返回 false

        • 如果栈不为空,弹出栈顶元素,检查它是否与当前右括号匹配。如果匹配,则继续;否则,返回 false

  2. 检查栈的状态

    • 遍历完字符串后,如果栈为空,说明所有的左括号都有匹配的右括号,返回 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("({[]})"));

 

 
posted @ 2025-03-25 18:17  我是格鲁特  阅读(125)  评论(0)    收藏  举报