OCI SWE · VO Coding

Oracle Valid Parentheses:栈验证括号嵌套

OCI VO 题目出现 valid parenthesis,本文给出多种括号的栈验证、错误顺序和空串边界。

题目重点:OCI VO 题目出现 valid parenthesis,本文给出多种括号的栈验证、错误顺序和空串边界。

题意与假设

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

  • 训练字符集为 ()[]{},空串合法;其他字符报错,而非自动忽略。
  • 左括号必须由同类型的最近未闭合括号关闭,只有数量相同不够。

解题路线

  1. 扫描左括号压栈;扫描右括号时栈必须非空且栈顶是匹配左括号,弹出后继续。
  2. 结束时栈为空才合法。扫描前缀后栈恰为尚未闭合的左括号,按嵌套次序排列;每个右括号只能与其顶端匹配。
  3. 若只有一种括号,可用计数并保证扫描任何前缀计数非负;多种括号必须记录类型顺序。

手动走一遍

([]) 依次压入 ( 和 [,随后 ]、) 匹配返回 true;([)] 虽然各类型左右数量相同,但遇 ) 时栈顶是 [,返回 false。

Python 参考实现

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

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

"""Validate well-nested (), [] and {} delimiters."""


def valid_parentheses(value: str) -> bool:
    match = {")": "(", "]": "[", "}": "{"}
    stack: list[str] = []
    for char in value:
        if char in "([{":
            stack.append(char)
        elif char in match:
            if not stack or stack.pop() != match[char]:
                return False
        else:
            raise ValueError("unexpected character")
    return not stack

复杂度

N 个字符 O(N) 时间,最深嵌套 D 时 O(D) 栈空间,最坏 O(N)。

易错点与追问

容易失分的边界

  • 只统计三种括号数量,无法发现 ([)] 错序。
  • 扫描中栈为空仍弹出,导致异常而非无效结果。
  • 处理完字符串不检查剩余左括号。

继续深挖

  • 若表达式含字符串字面量和转义括号,需怎样先做词法处理?
  • 若要返回首个错误位置而非布尔值,接口如何扩展?
✓已复制微信号!