问题描述
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
1 | 输入: "(()" |
示例 2:
1 | 输入: ")()())" |
解题思路
本题的一种思路是使用栈,栈中元素保存[字符,最大长度]
初始化栈
stack
和最大长度max_len
遍历字符串
如果当前字符是
)
,且栈顶元素stack[-1] = ['(', length]
,那么:当前匹配长度 =
length + 2
弹出栈顶元素
stack[-1][1] += 当前匹配长度
max_len = max(stack[-1][1], max_len)
否则,将
['x', 0]
压栈返回
max_len
即为最长有效括号
代码
1 | class Solution: |
另外一种解题思路是采用栈和动态规划:
- 定义
start
变量记录合法括号串的起始位置 - 遍历字符串
- 如果遇到
(
,则将当前下标压入栈 - 如果遇到
)
,则有两种情况:- 如果当前栈为空,则将下一个坐标位置记录到
start
- 如果当前栈不为空,则将栈顶元素取出
- 若此时栈为空,最长值=
max(最长值, 当前下标 - start + 1)
- 否则最长值=
max(最长值, 当前下标 - 栈顶元素值)
- 若此时栈为空,最长值=
- 如果当前栈为空,则将下一个坐标位置记录到
代码实现如下:
1 | class Solution: |
此算法比上面的在空间复杂度上更优。