class Solution {
public:
//动态规划
//dp[i]表示i的时候匹配的最长有效括号数
//dp[0]的时候不存在匹配,因此为0
//因为只有当')'才能在i处匹配,并且小于2的时候不存在匹配,所以从1开始
int longestValidParentheses(string s) {
vector<int> dp(s.length());
int cnt = 0;
for (int i = 1; i < s.length(); i++){
if (s[i] == ')'){
if (s[i - 1] == '('){
dp[i] = dp[i - 1] + 2;//和s[i - 1]匹配
if (i - 2 >= 0) //为了求连续子串,所以要考虑边界,找前面的也就是i-1-1的时候是否有值
dp[i] = dp[i] + dp[i - 2];//得到连续的最大匹配串
}
else if (dp[i - 1] > 0){//往前找,如果dp[i - 1] > 0 则考虑i - 1 - dp[i - 1]的值
if (i - 1 - dp[i - 1] >= 0 && s[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];
}
}
}
cnt = max(cnt, dp[i]);
}
return cnt;
}
};