第二道20.有效的括号

第二道:20.有效的括号

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

有效字符串需满足:

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

示例 1:

输入: “()”
输出: true
示例 2:

输入: “()[]{}”
输出: true
示例 3:

输入: “(]”
输出: false
示例 4:

输入: “([)]”
输出: false
示例 5:

输入: “{[]}”
输出: true

第一次解题思路[看题解后]:

  • 使用栈的思想,先进后出,可以完美匹配’{[]}'这种情况
  • 如果元素是字符的左半部分则放入栈中(此时不知道左半部分是否可以匹配所以放入栈中),等待出现右半部分时对栈顶元素进行匹配,也就是说匹配离他最近的元素(所以使用栈进行存储),如果不匹配则是说明字符串匹配失败;
  • 时间复杂度o(n),空间复杂度o(n)
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let arr =[],template={')':'(','}':'{',']':'['}
    for(let char of s){
        if(template[char]==undefined){
            arr.push(char)
        }else if(template[char] === arr[arr.length-1]){
            arr.pop()
        }
    }
    if(arr.length>0){
        return false
    }else{
        return true
    }
};
解答错误:主要原因是在检查字符串是否是左字符串,出现右字符串后是否与存储字符串匹配,如果不匹配则直接返回false,此时没有返回false

第二次解题思路:

  • 主要添加第一次错误原因的逻辑
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let arr =[],template={')':'(','}':'{',']':'['}
    for(let char of s){
        if(template[char]==undefined){
            arr.push(char)
        }else if(template[char] === arr[arr.length-1]){
            arr.pop()
        }else{
            return false
        }
    }
    if(arr.length>0){
        return false
    }else{
        return true
    }
};
运行时间:76ms;内存消耗:38.9mb

总结考点:

  • 本题主要考点为使用栈的先进后出的思想,可以使用数组操作最后一个 元素进行模拟栈思想
  • 左右字符匹配的对应值写成对象的模式

备注:第一次新建:2020-11-18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值