#20
Easy
单调栈

Valid Parentheses

判断括号字符串是否合法。

StringStack

题目定位

这其实是普通栈题而非严格单调栈题,但它很适合训练用后进先出结构去匹配最近未闭合左括号的直觉。

关键观察

每个右括号都必须匹配最近那个尚未闭合的左括号,而不是任意更早的一个。

目标复杂度

O(n) / O(n)

这题的解法思路怎么拆

1

这其实是普通栈题而非严格单调栈题,但它很适合训练用后进先出结构去匹配最近未闭合左括号的直觉。

2

每个右括号都必须匹配最近那个尚未闭合的左括号,而不是任意更早的一个。

3

先明确栈维护的是哪种“尚未解决”的关系。

4

只要单调性不被破坏,就持续压栈。

参考实现

Python
# Generic pattern template
stack = []
for i, value in enumerate(nums):
    while stack and nums[stack[-1]] < value:
        prev_index = stack.pop()
        # value is the next greater for prev_index
    stack.append(i)

常见坑点

warning

字符串以右括号开头时直接对空栈弹出。

warning

多种括号混合时匹配类型判断写错。

高频追问

如果要返回第一个非法位置,该怎么改?

如果允许通配括号呢?

继续刷相关题

先把 单调栈 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 20. Valid Parentheses 题解思路 | Interview AiBox