LeetCode有效的括号 | 算法练习系列

209 阅读2分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

前言

作为一个开发人员,我们日常开发的过程中应该都用过格式校验工具,比如我就是用的ESLint,它可以帮我们校验书写的格式是不是正确,比如是不是少了逗号,少了分号,或者是少写了括号,那它是怎么来识别少写了括的呢,俺也不知道,刚好又个算法题是判断是否是有效括号的,我们不妨一起来看看

题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。  

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([)]"

输出:false

示例 5:

输入:s = "{[]}"

输出:true

解题思路

  • 首先通过观察我们发现,符合条件的括号也就()[]{}这三种情况,那么我们只要判断输入内容中的项是否符合这三个条件就行了
  • 首先声明一个数组calculateArr,用来存放左括号,通过for循环来判断每一项是不是左括号,是就存进calculateArr
  • 如果不是左括号就拿着这个项和calculateArr.pop()对比,如果是一对括号就继续,如果不是直接return false
  • 最后循环解说要判断calculateArr是否为空,为空就返回true,否则返回false,下面来两种方法,代码如下 方法1:
var isValid = function(s) {
    let originalArr= s.split('')
    let calculateArr=[]
    let count=0
    for(let i=0;i<originalArr.length;i++){
        if(originalArr[i]==='(' || originalArr[i]==='[' ||originalArr[i]==='{'){
            calculateArr.push(originalArr[i])
            count++
        }else if(originalArr[i]===')' && calculateArr[count-1]==='('  || originalArr[i]===']' && calculateArr[count-1]==='[' ||originalArr[i]==='}'&& calculateArr[count-1]==='{'){
            calculateArr.pop(originalArr[count-1])
            count--

        }else{
            return false
        }
    }
    if(calculateArr.length){
        return false
    }else{
        return true
    }
};

LeetCode运行结果如下:

不牛逼.PNG 方法二:

var isValid = function(s) {
    let templete = new Map()
    templete.set("(",")")
    templete.set("[","]")
    templete.set("{","}")
    let calculate=[]
    for(let i=0;i<s.length;i++){
        if(templete.has(s[i])){
            calculate.push(templete.get(s[i]))
        }else{
            if(calculate.pop()!==s[i]){
                return false
            }
        }
    }
    if(calculate.length){
        return false
    }else{
        return true
    }
};

LeetCode运行结果如下:

牛逼.PNG

总结

上述的两种方法虽然不同,但是思路都是一样的,都是先明确括号的三种状态,然后对输入的内容进行一项一项的对比,最终得到结果,第二种方法看起来会更简洁一点,而且效率也更高,如有更好的方法,欢迎大家评论指点。