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


    题目:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    示例 1:
    输入:s = "()"
    输出:true

    示例 2:
    输入:s = "()[]{}"
    输出:true

    示例 3:
    输入:s = "(]"
    输出:false

    示例 4:
    输入:s = "([)]"
    输出:false

    示例 5:
    输入:s = "{[]}"
    输出:true

    解题信息

    如果咱们确实没有刷过算法,不知道那么多套路,通过题目和示例尽可能的获取到更多的信息就很重要了。
    根据题目推断出:
    字符串s的长度一定是偶数,不可能是奇数(一对对匹配)。
    右括号前面一定跟着左括号,才符合匹配条件,具备对称性。
    右括号前面如果不是左括号,一定不是有效的括号。


    const isValid = (s) => {
    while (true) {
    let len = s.length
    // 将字符串按照匹配对,挨个替换为''
    s = s.replace('{}', '').replace('[]', '').replace('()', '')
    // 有两种情况s.length会等于len
    // 1. s匹配完了,变成了空字符串
    // 2. s无法继续匹配,导致其长度和一开始的len一样,比如({],一开始len是3,匹配完还是3,说明不用继续匹配了,结果就是false
    console.log(len+":gg---:"+s.length)
    if (s.length === len) {
    return len === 0
    }
    }
    }
    //执行结果例子
    isValid('')
    //0:gg---:0
    //true
    isValid('()')
    //2:gg---:0
    //0:gg---:0
    //true
    isValid('([{}])')
    //6:gg---:0
    //0:gg---:0
    //true
    isValid('([{')
    //3:gg---:3
    //false
    isValid('([{})]')
    //6:gg---:4
    //4:gg---:4
    //false

    //这个语句直接放在浏览器执行有语法错误
    while(true){
    console.log('gg');
    if(Math.random()>0.5){
    return false
    }
    }


    //测试案例,当判断条件达成,返回false,结束while循环
    function isValid(){
    while(true){
    console.log('gg');
    if(Math.random()>0.5){
    return true //这里return true ;return false; break; 都可以跳出循环(整个循环);continue不行,continue是跳出当前循环i继续下次循环i+1;
    }
    }
    }

    //栈解题思路
    const isValid = (s) => {
    // 空字符串符合条件
    if (!s) {
    return true
    }

    const leftToRight = {
    '(': ')',
    '[': ']',
    '{': '}'
    }
    const stack = []

    for (let i = 0, len = s.length; i < len; i++) {
    const ch = s[i]
    // 左括号
    if (leftToRight[ch]) {
    stack.push(ch)
    } else {
    // 右括号开始匹配
    // 1. 如果栈内没有左括号,直接false
    // 2. 有数据但是栈顶元素不是当前的右括号
    if (!stack.length || leftToRight[ stack.pop() ] !== ch) {
    return false
    }
    }
    }

    // 最后检查栈内还有没有元素,有说明还有未匹配则不符合
    return !stack.length
    }

  • 相关阅读:
    SpringBoot Shiro 配置自定义密码加密器
    SpringBoot Druid 配置详解
    UOJ #164. 【清华集训2015】V | 线段树
    BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树
    51nod 1462 树据结构 | 树链剖分 矩阵乘法
    BZOJ 3503 [CQOI2014]和谐矩阵
    BZOJ 4004 [JLOI2015]装备购买 | 线性基
    BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
    LOJ #2145. 「SHOI2017」分手是祝愿
    LOJ #2141. 「SHOI2017」期末考试
  • 原文地址:https://www.cnblogs.com/wulinzi/p/15908444.html
Copyright © 2020-2023  润新知