题目重点:OCI VO 题目出现 valid parenthesis,本文给出多种括号的栈验证、错误顺序和空串边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练字符集为 ()[]{},空串合法;其他字符报错,而非自动忽略。
- 左括号必须由同类型的最近未闭合括号关闭,只有数量相同不够。
解题路线
- 扫描左括号压栈;扫描右括号时栈必须非空且栈顶是匹配左括号,弹出后继续。
- 结束时栈为空才合法。扫描前缀后栈恰为尚未闭合的左括号,按嵌套次序排列;每个右括号只能与其顶端匹配。
- 若只有一种括号,可用计数并保证扫描任何前缀计数非负;多种括号必须记录类型顺序。
手动走一遍
([]) 依次压入 ( 和 [,随后 ]、) 匹配返回 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)。
易错点与追问
容易失分的边界
- 只统计三种括号数量,无法发现 ([)] 错序。
- 扫描中栈为空仍弹出,导致异常而非无效结果。
- 处理完字符串不检查剩余左括号。
继续深挖
- 若表达式含字符串字面量和转义括号,需怎样先做词法处理?
- 若要返回首个错误位置而非布尔值,接口如何扩展?
