题目链接
英文链接: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 { |