js 实现括号匹配算法

1,710 阅读1分钟

题目:给定一个只包括'(',')','[',']','{','}'的字符串str,判断字符串是否有效。 有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合
  • 左括号必须以正确的顺序闭合

主要理解栈的先进后出的概念

解题思路:

  • 遇到(,[,{将对应需要消除的),],}放入栈中
  • 遇到),],}不放入栈中并且合法的字符串必然可以和栈顶相等消除

数组的pop方法移除数组的最后一个元素,并返回该元素。

function isValid(str){
    if(str.length() % 2 == 1){ // 如果括号的长度为奇数,肯定是不匹配的
      return false
   }
   const stack = [];
   for(let val of str){
      if(val === '(') stack.push(')');
      else if(val=== '[') stack.push(']');
      else if(val === '{') stack.push('}');
      else if(stack.length === 0 || val !== stack.pop())
      return fasle;
   }
   return stack.length == 0
}
console.log(isValid('{[]()[}')) // false

简化版

funtion isValid(str){
   const stack = []
   map ={
     "(":")",
     "{":"}",
     "[":"]",
   };
   for(const x of str){
      if(x in map){
        stack.push(x);
        continue;
      };
      if(map[stack.pop()] !== x) return false;
   }
   return !stack.length
}