问题描述
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 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: |
此算法比上面的在空间复杂度上更优。