题目重点:计算混合文本中的圆括号嵌套深度,同时核对输入是否完整匹配。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练忽略非圆括号字符,但要求()正确匹配;非法抛ValueError,空串和无括号文本深度0。只处理圆括号,不按其他括号计深度。
解题路线
- 维护当前balance,遇(加1并更新best,遇)减1。任意位置balance<0表示缺开括号,直接拒绝;末尾balance非0表示缺闭括号。
- 在合法文本中,每个未闭合(都包围当前位置,所以balance恰好是当前深度,最大前缀值就是最大嵌套数。文字不改变层数。
- 不能只算出现多少个(,并列两个浅表达式不产生更深层;不能只返回最终balance,因为合法文本结尾一定0。
- 如果题面保证合法,可省异常检查但要写清前提。混合编程语言字符串里引号/注释内括号是否忽略需要lexer,本题不是源代码解析器。
手动走一遍
(a+(b*c))最大2,(a)(b)最大1,abc为0;)(即使最终balance0也非法。a(b未闭合必须拒绝,不默默返回1。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def maximum_depth(text):
"""Ignore other characters, reject malformed parentheses."""
balance=0;best=0
for ch in text:
if ch=='(':balance+=1;best=max(best,balance)
elif ch==')':
balance-=1
if balance<0:raise ValueError('unmatched close')
if balance:raise ValueError('unmatched open')
return best
复杂度
O(n)时间/O(1)空间,整数counter在输入长度范围。若要返回最深子表达式位置,再记录达到best时起点或栈,需明确输出与空间。
易错点与追问
容易失分的边界
- 净balance0不足以保证合法。
- 把总开括号数当深度会高估平行分组。
继续深挖
- 多类括号要求类型匹配时为何需要栈?
- 若要给每字符深度数组,输出空间怎样计?
