SWE / PE · Coding

Meta 三类括号匹配:栈顶类型与非括号字符

验证圆、方、花括号嵌套,保留顺序约束并说明混合文字的处理。

题目重点:验证圆、方、花括号嵌套,保留顺序约束并说明混合文字的处理。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练匹配()[]{},其他字符忽略;任何闭括号必须关闭当前栈顶同类开括号。引号里的括号也参与,本接口不理解代码字符串/注释。

解题路线

  1. 遇开括号压栈,遇闭括号先检查非空,再弹栈并比对对应开括号。不符立即False,最后要求栈空。
  2. 为什么类型计数不能替代栈?([)]每类开闭次数相同、每类净计数0,却交叉嵌套;后进先出的最后未关类型才是下一次合法闭合对象。
  3. 其他文字忽略不是非法输入,这是训练选项;若纯括号题要求reject nonbracket,只需入口校验,核心栈不变,不能在无合同情况下自动择一。
  4. 空串合法,自由文本无括号合法,未关闭开括号非法。算法不修改输入,短路失败不需继续读取其余字符。

手动走一遍

a{b[c(d)]}e合法;([)]在)处栈顶[不匹配,失败;]从空栈闭合失败;(()结束栈非空失败。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def balanced_brackets(text):
    """ASCII (), [], {}, ignore all other text (not a quoted-language parser)."""
    stack=[];closing={')':'(',']':'[','}':'{'}
    for ch in text:
        if ch in '([{':stack.append(ch)
        elif ch in closing:
            if not stack or stack.pop()!=closing[ch]:return False
    return not stack

复杂度

O(n)时间/O(depth)空间,最坏O(n)。只有一种括号时可用counter O(1),多个类型嵌套需要记顺序,不能直接套单counter。

易错点与追问

容易失分的边界

  • 只检查各类数量,不检查嵌套顺序。
  • 按编程语义默认忽略引号内括号,但示例只是字符流不是lexer。

继续深挖

  • 在线分块读取时怎样保留栈并在最终块判断完整性?
  • 如果允许删除最少字符修复三类括号,局部遇错丢弃栈顶不保证全局最优。
✓已复制微信号!