计算有效的括号

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

def isValid(s):
    stack = []  # 初始化空栈
    mapping = {')': '(', '}': '{', ']': '['}  # 右括号到左括号的映射
    for char in s:  # 遍历字符串中的每个字符
        if char in mapping:  # 如果当前字符是右括号
            top = stack.pop() if stack else '#'  # 弹出栈顶左括号(栈空时返回'#')
            if mapping[char] != top:  # 检查是否匹配
                return False
        else:  # 如果是左括号,压入栈
            stack.append(char)
    return not stack  # 栈空则所有括号匹配成功
  • 输入:一个字符串 s,仅包含 ( ) { } [ ] 和其他字符(其他字符不影响判断)。

  • 输出True(如果括号匹配正确)或 False(如果括号不匹配)。

核心思路

  1. 栈(Stack)的应用

    • 用栈来跟踪未闭合的括号,遵循 后进先出(LIFO) 原则。

    • 遇到 左括号({[)时压入栈。

    • 遇到 右括号)}])时,检查栈顶的左括号是否与之匹配。

  2. 哈希表(字典)辅助

    • 使用字典 mapping 存储右括号到左括号的映射,方便快速查找匹配关系。

关键步骤分析

  1. 处理右括号

    • 当遇到 )}] 时,从栈中弹出栈顶元素(即最近未匹配的左括号)。

    • 如果栈为空(无左括号可匹配),则返回 False(通过 '#' 占位符实现)。

    • 检查弹出的左括号是否与当前右括号匹配(通过 mapping 字典查找)。

  2. 处理左括号

    • 直接压入栈中,等待后续匹配。

  3. 最终检查

    • 遍历结束后,如果栈为空,说明所有括号均正确闭合;否则说明有未闭合的左括号。

示例演示

以输入 s = "()[{}]" 为例:

  1. (:压入栈 → stack = ['(']

  2. ):弹出 (,与 mapping[')'] 匹配 → stack = []

  3. [:压入栈 → stack = ['[']

  4. {:压入栈 → stack = ['[', '{']

  5. }:弹出 {,与 mapping['}'] 匹配 → stack = ['[']

  6. ]:弹出 [,与 mapping[']'] 匹配 → stack = []

  7. 栈空 → 返回 True

边界情况处理

  1. 空字符串

    • 直接返回 Truenot [] 为 True)。

  2. 只有左括号(如 "({"):

    • 栈不为空 → 返回 False

  3. 只有右括号(如 ")}"):

    • 弹出操作时栈为空 → 返回 False

  4. 交错括号(如 "([)]"):

    • ] 期望匹配 [,但栈顶是 ( → 返回 False

优化与变种

  1. 提前终止

    • 如果字符串长度为奇数,直接返回 False(因为括号必须成对出现)。

  2. 扩展其他符号

    • 如需支持更多括号类型(如 < >),只需扩展 mapping 字典。

总结

这段代码高效地利用了  和 哈希表 的特性,以简洁的逻辑解决了括号匹配问题,是栈结构的经典应用场景。

posted @ 2025-04-12 12:48  同州  阅读(20)  评论(0)    收藏  举报