32. 最长有效括号 - 力扣(LeetCode) (leetcode-cn.com)
动态规划:
dp[i]表示以i为结尾的最长有效括号子串的长度。参考题解如下:
class Solution {
public:
int longestValidParentheses(string s) {
//dp[i]为以i为末尾的最长有效括号子串的长度
vector<int> dp(s.size(), 0);
int ans = 0;
for(int i = 1; i < s.size(); i++) {
if(s[i] == ')') {
if(s[i-1] == '(') {
//i-1 和 i 凑成一对,如果前面还有一对,那+2就可以了
dp[i] = 2; //针对i<2的情况,前面凑不出一对
if(i >= 2) {
dp[i] = dp[i-2] + dp[i];
}
}
//i-1为),i-1作为末尾凑成了一对,不然就没有意义了
//而且,必然形如:((...)) 。这样就需要找到i对应的最左侧(,其下标为i-dp[i-1]-1
else if(dp[i-1] > 0) {
//i-dp[i-1]-1为合法下标,且确实是左括号的下标
if(i - dp[i-1] - 1 >= 0 && s[i - dp[i-1] - 1] == '(') {
//dp[i]的值即为dp[i-1]左右各+1
dp[i] = dp[i-1] + 2;
//如果上面讨论的最左侧(,左侧还有一对括号
if(i - dp[i-1] - 2 >= 0) {
dp[i] = dp[i] + dp[i - dp[i-1] - 2];
}
}
}
}
ans = max(ans, dp[i]);
}
return ans;
}
};