leetcode—【20】有效的括号

题目:有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例:

输入: "()"
输出: true
输入: "(]"
输出: false

题解:

需要遍历时,是从左往右遍历,左括号需要等着右括号匹配,先把左括号存起来,若是右括号,判断是否匹配

step1:对字符串进行处理转换成数组,split,这样避免字符串中有空字符

step2:判断数组的长度,若为奇数,则返回false

step3:定义一个数组,用来存储等待匹配的左括号

step4:定义一个map,用来建立括号的映射关系

step5:遍历数组,若是左括号,则存入数组中,若是右括号,则取出数组栈顶元素

step6:判断当前栈顶元素与当前右括号是否匹配,若匹配,栈顶元素出栈,则进行下一轮

step7:若不匹配,则返回false

step8:循环结束,判断数组栈中是否都已经匹配完,若未匹配完,返回false

step9:返回true

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
   //对字符串进行处理,排除空字符对干扰
   let arr = s.split('')
   let len = arr.length
   //定义数组,用来存储需要匹配的左括号
   let stack = []
   //定义一个map结构,用来建立括号的映射关系
   let map = new Map()
   map.set("(",")")
   map.set("[","]")
   map.set("{","}")
   //若字符串为奇数,则返回false
   if(len % 2 != 0){
       return false
   }
   //循环遍历数组
   for(let i=0;i<len;i++){
       //如果为左括号,则入栈
       if(map.has(arr[i])){
           stack.push(arr[i])
       }else{
           //判断栈的长度,当前是否有可以匹配的元素,没有返回true
           if(stack.length === 0){
               return false
           }else {
               //判断当前栈顶元素,与所遍历的数组是否匹配
               let top = stack[stack.length-1]
               if(arr[i] === map.get(top)){
                   //匹配则弹出栈顶元素
                   stack.pop()
               }else {
                   //不匹配,则返回false
                   return false
               }
           }
       }
   }
   //进一步判断当前栈是否有待匹配元素
   if(stack.length > 0) return false
   else return true
};

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值