利用了dp的做法,需要分别讨论六种情况。
class Solution {
public:
int dp[30005];//dp[..n]表示最后字符下标为n时的最长合法括号
int longestValidParentheses(string s) {
dp[0] = 0;int ans = 0;
if(s[0]=='('&&s[1]==')'){
dp[1] = 2;ans=2;//预处理
}
for(int i=2;i<s.length();i++){
if(s[i]=='('){//最后一个为),显然0=
dp[i] = 0;
}else{
if(s[i-1]=='('){//”(()“形式
dp[i] = dp[i-2]+2;
}else{
int pre = i-1-dp[i-1];//从pre+1..n-1都是合法序列,找到第一个要判别的
if(pre<0){//判下特殊情况,例如”())“
dp[i] = 0;
continue;
}
if(s[pre]=='('){
if(pre<=0)dp[i] = dp[i-1]+2;
else dp[i] = dp[i-1]+2+dp[pre-1];//表示pre和n正好构成一个新的括号对,示例”()(())“
}
else dp[i] = 0;
}
}
ans = max(ans,dp[i]);
}
return ans;
}
};