[路飞]_有效的括号

171 阅读1分钟

题目介绍

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

有效字符串需满足:

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

示例1

输入: s = "()"
输出: true

示例2

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

示例3

输入: s = "(]"
输出: false

示例4

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

示例5

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

提示:

解答思路

本题用栈来模拟,如果遇到左括号则入栈,如果遇到右括号,查看栈顶元素是否是与右括号相匹配的左括号,如果不是,说明括号无法闭合,如果遍历完整个字符串,所有的右括号都能够匹配到左括号,还需要再检查栈是否为空,如果不为空,说明存在无法配对的左括号,否则则是一个有效字符串

  1. 遍历 s 字符串的每个字符,如果是左括号,入栈
  2. 如果是右括号,查看栈顶元素是否匹配,不匹配,返回 false,匹配则继续遍历下一位
  3. 直到 s 遍历完成,判断栈的大小,如果不为0,返回 false,否则返回 true

5.gif

解题代码

var isValid = function(s) {
    const stack = []
    for (let i = 0; i < s.length; i++) {
        if (s[i] === '(' || s[i] === '{' || s[i] === '[') {
            stack.push(s[i])
            continue
        } 
        const val = stack.pop()
        switch (s[i]) {
            case ')':
                if (val !== '(') {
                    return false
                }
                break
            case '}':
                if (val !== '{') {
                    return false
                }
                break
            case ']':
                if (val !== '[') {
                    return false
                }
                break
        }
    }
    return !stack.length
};