判断表达式是否正确闭合,返回未闭合元素的下标。

刚解析完回文字符串的思路,趁热打铁把判断表达式是否闭合也理一理。此题中闭合元素只考虑圆括号(),方括号[],大括号{}。三种。方法不止一种。这只是我能想到的。

如果单纯的判断表达式是否闭合,不返回未闭合元素的下标。

  • 1,提取表达式中所有括号;
  • 2, 数量为奇数或者依右括号开始}])直接返回false;
  • 3, 否则,判断是{,[(的时候入栈,否则出栈, 如果最后数量是0返回true,否则false
function isClose(str) {
    let len = str.length;
    let reg = /(\[|\]|\{|\}|\(|\))/g;
    let arr = str.match(reg);
    if (arr.length % 2 || /(\}|\]|\))/.test(arr[0])) {
        return false
    } else {
        let stack = [];
        while (arr.length) {
            let _v = arr.shift()
            if (/(\[|\{|\()/.test(_v)) {
                console.log(1);
                stack.push(_v)
            } else {
                stack.pop()
            }
        };
        console.log(stack)
        return !stack.length
    }
}
复制代码

判断是否闭合,并返回下标呢。

利用双指针加字典解法。

  • 1.设置头尾双指针。
  • 2.分别判断头尾两个指针对应的元素是否是闭合元素,如果不是闭合元素,头指针向右移动,尾指针向左移动,直到两个指针指向的都是闭合元素。
  • 3.判断头尾对应的元素是不是闭合元素,不是则返回下标,重复2步骤。
var dir = {
    "{": "}",
    "[": "]",
    "(": ")",
    ")": "(",
    "}": "{"
}

function atWhereNoClose(str) {
    let len = str.length;
    let left = 0;
    let right = len - 1;
    let flg = true;
    while (left < right) {
        while (!/(\[|\{|\()/.test(str[left]) && left < right) {
            left++
        }
        while (!/(\}|\]|\))/.test(str[right]) && left < right) {
            right--
        }
        if (dir[str[left]] !== str[right]) {
            if (dir[str[left]] && left <= right) {
                flg = left
                break;
            }
        } else {
            left++
            right--
        }

    }
    return flg;
}
console.log(atWhereNoClose("{[[ab}}"))
console.log(atWhereNoClose("{ab}"))
console.log(atWhereNoClose("{({[ab]})}"))
console.log(atWhereNoClose("ab}"))
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值