SWE / PE · Coding

Meta 括号最大深度:前缀峰值与非法输入

计算混合文本中的圆括号嵌套深度,同时核对输入是否完整匹配。

题目重点:计算混合文本中的圆括号嵌套深度,同时核对输入是否完整匹配。

题意与假设

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

  • 训练忽略非圆括号字符,但要求()正确匹配;非法抛ValueError,空串和无括号文本深度0。只处理圆括号,不按其他括号计深度。

解题路线

  1. 维护当前balance,遇(加1并更新best,遇)减1。任意位置balance<0表示缺开括号,直接拒绝;末尾balance非0表示缺闭括号。
  2. 在合法文本中,每个未闭合(都包围当前位置,所以balance恰好是当前深度,最大前缀值就是最大嵌套数。文字不改变层数。
  3. 不能只算出现多少个(,并列两个浅表达式不产生更深层;不能只返回最终balance,因为合法文本结尾一定0。
  4. 如果题面保证合法,可省异常检查但要写清前提。混合编程语言字符串里引号/注释内括号是否忽略需要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不足以保证合法。
  • 把总开括号数当深度会高估平行分组。

继续深挖

  • 多类括号要求类型匹配时为何需要栈?
  • 若要给每字符深度数组,输出空间怎样计?
✓已复制微信号!