//缺陷:只能针对层层嵌套的括号
#define invalid -1
class Solution {
public:
bool ismatch(string& s,int i,int j)
{
if(s[i]=='('&&s[j]==')')
return true;
else
return false;
}
int longestValidParentheses(string s) {
//最长有序括号,连续
if(s.size()<=1)
return 0;
//vector<vector<int>> f(m + 1, vector<int>(n + 1));
vector<vector<int>> dp(s.size(),vector<int>(s.size()));
for(int i=0;i<s.size();i++)
for(int j=0;j<s.size();j++)
dp[i][j]=0;
/*
dp[i][j]:从i到j的连续最长括号
*/
//对step为1进行初始化
for(int i=0;i+1<s.size();i++)
{
if(ismatch(s,i,i+1))
dp[i][i+1]=2;
else
dp[i][i+1]=invalid;
}
int answer=2;
for(int step=3;step<s.size();step+=2)
{
for(int i=0;i+step<s.size();i++)
{
if(dp[i+1][i+step-1]==invalid)
{
dp[i][i+step]=invalid;
}else
{
if(ismatch(s,i,i+step))
dp[i][i+step]=dp[i+1][i+step-1]+2;
//状态转移方程不对
//只能针对层层嵌套的括号
else
dp[i][i+step]=dp[i+1][i+step-1];
}
answer=(answer>dp[i][i+step])?answer:dp[i][i+step];
}
}
return answer;
}
};