用区间dp O(n3)超时
dp[i]表示以i这个字符为终点的最长连续括号
class Solution {
public:
int longestValidParentheses(string s) {
int ans=0;
int dp[100000];
int n=s.size();
memset(dp,0,sizeof(dp));
for(int i=1;i<n;i++)
{
if(s[i]=='(') dp[i]=0;
else
{
if(s[i-1]=='(') i-2>=0?dp[i]=max(dp[i],dp[i-2]+2):dp[i]=max(dp[i],dp[i-1]+2);
else
{
int k=i-dp[i-1]-1;
if(k>=0&&s[k]=='(')
k==0?dp[i]=max(dp[i],dp[i-1]+2):dp[i]=max(dp[i],dp[k-1]+dp[i-1]+2);
}
}
ans=max(ans,dp[i]);
}
return ans;
}
};