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

一、题目

给定一个只包括 '('')''{''}''['']' 的字符串 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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值