JS实现各种括号成对匹配的算法

该博客主要探讨了一个JavaScript函数,用于检查给定字符串中的括号是否匹配正确。通过遍历字符串,检查左括号和右括号的匹配情况,确保成对出现并正确嵌套。测试用例展示了函数对于不同括号组合的有效性和无效性判断。
 const isValids = s => {
        //思路
        // 1 如果在字符串开通街舞找到反括号那么不匹配!
        // 2 如果在字符串中括号成对出现出现了错误的括号嵌套,就是说,上一个左括号必须匹配下一个同类型的右括号!
        // 3 如果括号不是成对出现的则也不匹配!
        //创建函数接受一个s的变量 判断一下参数存在并且是一个字符串,否则抛错!
        if (!s || typeof s !== 'string') {
          throw new Error('请为函数提供一个字符串!');
        }
        let lel = [...'({[<']; //声明左括号的数组
        let rgl = [...')}]>']; //声明右括号的数组
        let arr = []; //声明一个缓存左括号的数组
        let k = 0; //左括号素组的自定义下标
        let re = 1; //声明一个用于判断的结果
        let len = s.length; //声明一个字符串的length
        if (lel.includes(s[len - 1]) || rgl.includes(s[0])) {
          return false;
        } //如果在字符串的开头和结尾括号是反的直接返回false

        for (let i = 0; i < len; i++) {
          //循环字符串
          if ([...lel, ...rgl].includes(s[i])) {
            //如果在所有的括号字符串中找的到字符
            if (lel.includes(s[i])) {
              //如果匹配到左括号就直接在数组中缓存上左括号出现的下标
              arr[k] = i;
              k++; //同时缓存的数组k++
            }
            rgl.forEach((ele, index) => {
              //循环右括号数组
              if (ele === s[i]) {
                //如果在右括号数组中找到一个右括号
                if (s[arr[k - 1]] === lel[index]) {
                  //这里判断是不是成对的括号 ,因为左右括号的数组长度相同 括号也是成对匹配的 ,右括号的下标能取的到对应的左括号符号
                  //这里还有一个逻辑只有上一个括号和下一个括号是一对的那么括号匹配成立
                  arr.splice(k - 1, 1); //找到了就把成对的上一个括号删除
                  k--; //下标也建一下防止数组塌陷
                } else {
                  //反之不满足条件
                  re = 0; //不匹配
                }
              }
            });
          }
        }
        if (k !== 0) {
          //如果k不等于0代表缓存左括号的数组还有没匹配到同类型右括号的括号
          re = 0; //结果是false
        }
        if (re === 0) {
          //提供返回值
          return false;
        } else {
          return true;
        }
      };
      //测试
      console.log(isValids('{({}[])}<<<<>>>>'), '----------', '{({}[])}<<<<>>>>');
      console.log(isValids('{()}]'), '----------', '{()}]');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值