有效的括号

42 阅读2分钟

有效的括号 提示 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:s = "([])" 输出:true 示例 5: 输入:s = "([)]" 输出:false 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成

解题思路

判断有效括号的核心思路是利用的「后进先出」特性:

  1. 遍历字符串,遇到左括号((/{/[)时,将其压入栈中;

  2. 遇到右括号()/}/])时,检查栈顶是否是匹配的左括号:

    • 若栈为空(无匹配的左括号)或栈顶不匹配,直接返回 false
    • 若匹配,弹出栈顶元素(完成一次有效闭合);
  3. 遍历结束后,若栈为空(所有左括号都完成闭合),则返回 true,否则返回 false

代码实现(Python)

python

运行

def isValid(s: str) -> bool:
    # 定义右括号到左括号的映射,方便快速匹配
    bracket_map = {')': '(', '}': '{', ']': '['}
    stack = []
    
    for char in s:
        # 左括号:压入栈
        if char in bracket_map.values():
            stack.append(char)
        # 右括号:检查匹配
        elif char in bracket_map.keys():
            # 栈空 或 栈顶不匹配,直接返回False
            if not stack or stack[-1] != bracket_map[char]:
                return False
            # 匹配成功,弹出栈顶
            stack.pop()
        # 题目保证只有括号,此分支可省略
        else:
            return False
    
    # 遍历结束后栈必须为空(所有左括号都闭合)
    return len(stack) == 0

代码解释

  1. 映射表bracket_map 把右括号映射到对应的左括号,避免多层 if-else 判断;

  2. 栈操作

    • 左括号直接入栈,等待后续匹配;
    • 右括号先检查栈是否为空(无左括号可匹配),再检查栈顶是否匹配,不匹配则直接返回 false
  3. 最终校验:遍历完成后,若栈非空,说明有未闭合的左括号,返回 false

测试用例验证

python

运行

# 示例1
print(isValid("()"))  # True
# 示例2
print(isValid("()[]{}"))  # True
# 示例3
print(isValid("(]"))  # False
# 示例4
print(isValid("([])"))  # True
# 示例5
print(isValid("([)]"))  # False

复杂度分析

  • 时间复杂度:O (n),n 是字符串长度,每个字符仅遍历一次,栈操作(压入 / 弹出)都是 O (1);
  • 空间复杂度:O (n),最坏情况(全是左括号)栈需要存储所有字符。

该解法是判断有效括号的最优解,逻辑清晰且效率高,能覆盖所有边界情况(如空栈、嵌套括号、顺序错误等)。