给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
题目来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/longest-valid-parentheses
思路分析
为了求出有效的括号组合最长长度,那么此处采用动态规划的思想实现。
- 有效的括号组合就两种:
- 那么在第一种的情况下,j假设
)
在字符串中的位置是i
,那么我们知道有效的最长长度应该是(
前一个位置长度dp[i - 2]
,加上2得到dp[i]
的长度,即d[i] = dp[i - 2] + 2
。此处dp[i]
表示位置i
处的最长有效括号长度。 - 在第二种情况下,我们可以这样想,比如后一个括号的位置为
i
,那么,第i - 1
位置的dp[ i - 1]
,已知,那么我们可以计算出与位置i
处的右括号的匹配的左括号,位置为i - 2 - d[i - 1]
,那么与位置i
的括号匹配的个数为dp[i] = dp[i - 2 - dp[i - 1]] + 2
,但不要忘记了,还要加上中间部分dp[ i - 1]
的括号长度。
代码分析
class Solution {
public:
int longestValidParentheses(string s) {
int _max = 0;
vector<int> dp(s.size(),0);//第一个位置不用考虑有效括号长度,因为不存在
for (int i = 1; i < s.size(); i++) {
if (s[i] == ')') {
if (s[i - 1] == '(')//第一种情形
dp[i] = (i - 2 >= 0 ? dp[i - 2] : 0) + 2;
else if (i - dp[i - 1] - 1 >= 0 && s[i - dp[i - 1] - 1] == '(')//第二种情形
dp[i] = (i - dp[i - 1] - 2 >= 0 ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2;
}
_max = max(dp[i], _max);
}
return _max;
}
};