题目重点:验证圆、方、花括号嵌套,保留顺序约束并说明混合文字的处理。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练匹配()[]{},其他字符忽略;任何闭括号必须关闭当前栈顶同类开括号。引号里的括号也参与,本接口不理解代码字符串/注释。
解题路线
- 遇开括号压栈,遇闭括号先检查非空,再弹栈并比对对应开括号。不符立即False,最后要求栈空。
- 为什么类型计数不能替代栈?([)]每类开闭次数相同、每类净计数0,却交叉嵌套;后进先出的最后未关类型才是下一次合法闭合对象。
- 其他文字忽略不是非法输入,这是训练选项;若纯括号题要求reject nonbracket,只需入口校验,核心栈不变,不能在无合同情况下自动择一。
- 空串合法,自由文本无括号合法,未关闭开括号非法。算法不修改输入,短路失败不需继续读取其余字符。
手动走一遍
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。
继续深挖
- 在线分块读取时怎样保留栈并在最终块判断完整性?
- 如果允许删除最少字符修复三类括号,局部遇错丢弃栈顶不保证全局最优。
