题目链接
英文链接:https://leetcode.com/problems/longest-valid-parentheses/
中文链接:https://leetcode-cn.com/problems/longest-valid-parentheses/
题目详述
给定一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
1 | 输入: "(()" |
示例 2:
1 | 输入: ")()())" |
题目详解
- 动态规划。
f(i)
表示当前以)
结尾的匹配括号长度。- 当前
s[i] == '('
,则f(i) = 0
。 - 当前
s[i] == ')'
,则- 如果
s[i - 1] == '('
,则f[i] = f[i - 2] + 2
,形如...()
。 - 如果
s[i - f[i - 1] - 1] == '('
,则f[i] = f[i - f[i - 1] - 2] + f[i - 1] + 2
,形如...(...)
。
- 如果
- 结果为状态数组最大值。
- 时间复杂度为
O(n)
,空间复杂度为O(n)
。
1 | public class LeetCode_00032 { |
- 可以换一种思路,运用两个变量
left
和right
进行计数。 - 从左往右遍历字符串,碰到
(
,left
自增;碰到)
,right
自增。- 如果
left > right
,存在匹配的可能性,继续向前遍历。 - 如果
left == right
,说明括号匹配成功,此时长度为left + right
,更新结果。 - 如果
left < right
,说明这一段不能匹配成功,重置left = right = 0
。
- 如果
- 为了得到正确结果,还需要从右往左遍历一次。
- 如果
left > right
,说明这一段不能匹配成功,重置left = right = 0
。 - 如果
left == right
,说明括号匹配成功,此时长度为left + right
,更新结果。 - 如果
left < right
,存在匹配的可能性,继续向前遍历。
- 如果
- 时间复杂度为
O(n)
,空间复杂度为O(1)
。
1 | public class LeetCode_00032 { |