算法题-有效的括号-leecode20

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

有效字符串需满足:

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

链接:leetcode-cn.com/problems/va…

解题思路

对于没有闭合的左括号而言,越靠后的左括号,对应的右括号越靠前。
满足后进先出,使用栈。

解题步骤

  • 新建一个栈
  • 扫描字符串,遇到左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定不合法
  • 最后栈空了就合法,否则不合法
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    if(s.length % 2 === 1) return false; //这里做了个优化,如果为奇数直接判定不合法并且返回
    const stack = []
    for(let i=0;i<s.length;i++){
        const c = s[i]
        if(c === '(' || c === '[' || c === '{'){
            stack.push(c)
        }else {
            let t = stack[stack.length-1]
            if(
                (t === "(" && c === ')') || 
                (t === '[' && c === ']') || 
                (t === '{' && c === '}')
            ) {
                    stack.pop()
            } else {
                return false
            }
        }
    }
    return stack.length === 0
};
复制代码

时间复杂度和空间复杂度

时间复杂度O(n) 空间复杂度O(n)

用map优化代码

可以将左右括号表现为键值对,代码如下:

 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    if(s.length % 2 === 1) return false;
    const stack = []
    const map = new Map()
    map.set("(",")")
    map.set("[","]")
    map.set("{","}")
    for(let i=0;i<s.length;i++){
        const c = s[i]
        if(map.has(c)){
            stack.push(c)
        }else {
            let t = stack[stack.length-1]
            if(
                map.get(t) === c
            ) {
                    stack.pop()
            } else {
                return false
            }
        }
    }
    return stack.length === 0
};
复制代码

时间复杂度和空间复杂度

时间复杂度O(n) 空间复杂度O(n)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享