LeetCode 偶尔一题 —— 20. 有效的括号

468 阅读1分钟

原文地址:juejin.cn/post/689053…
原题地址:leetcode-cn.com/problems/va…

题目

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

有效字符串需满足:

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

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

解题思路

🧐 题目里给出的字符串只包括:'('')''{''}''['']',同时还满足:

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

🙄 必须要满足的条件是:

  • 遇到右括号之前,前面的括号都必须是左括号

因此我们的的逻辑中必须包含这样一段:

while (...) {
    if (左括号) {
        存左括号
    } else {
        if (之前一个是左括号且类型相同) {
            抵消
        } else {
            不是有效的括号呀
        }
    }
}

到这里其实思路就很清晰了,以下是完整的代码:

/**
 * @param {string} s
 * @return {boolean}
 */
const isValid = function(s) {
    if (!s) {
        return true
    }
    let i = 1
    const stack = [s.charAt(0)]
    const pairs = ['[]', '{}', '()']
    while (stack.length || i < s.length) {
        if (pairs.some((pair) => pair.charAt(0) === s.charAt(i))) {
            stack.push(s.charAt(i))
        } else {
            const left = stack.pop()
            if (!pairs.some((pair) => pair.charAt(0) === left && pair.charAt(1) === s.charAt(i))) {
                return false
            }
        }
        i++
    }
    return true
}