Leetcode刷题(第20题)——有效的括号

x33g5p2x  于2022-02-28 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(214)

一、题目

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

二、示例

示例 1
输入:s = "()"
输出:true

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

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

三、解题思路
本题采用的解题方法是使用栈数据结构,如果遇到{,[,(的话,则入栈,如果遇到),},]的话,则出栈比较,判断是否是左右括号。
四、代码
方法一

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let array = []
    for(let i = 0; i < s.length; i++) {
        if(s[i] === "(" || s[i] === "{" || s[i] === "[") {
            array.push(s[i])
        }else {
            let cur = array.pop()
            if(cur === "(" && s[i] === ")" || 
               cur === "[" && s[i] === "]" ||
               cur === "{" && s[i] === "}") {
                   continue
               }else {
                   return false
               }    
        }
    }
    return array.length === 0 
};

上述代码我们使用判断,导致代码很冗余。此时我们可以使用map来保存{ },(), []之间的关系。
具体代码如下图所示。

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let array = []
    let map = new Map()
    map.set("(", ")")
    map.set("{", "}")
    map.set("[", "]")
    for(let i = 0; i < s.length; i++) {
        if(map.has(s[i])) {
            array.push(s[i])
        }else {
            if(map.get(array.pop()) === s[i]) {
                continue
            }else {
                return false
            }
        }
    }
    return array.length === 0
};

五、结果

时间复杂度为O(n),空间复杂度为O(n)。

相关文章