思路:
动态规划 ,dp[i]表示以s[i]结尾的,最长的子串长度
很明显,当s[i]=='('时,不能构成完整子串,dp[i]=0,
当s[i]==')'时,若s[i-1]==‘(’,则dp[i]=dp[i-2]+2
当s[i-1]==')'时,则需要向前找,看是否有s[j]==‘(’ ,因为要构成子串,所以只需看dp[i-1]构成的子串的开始位置,往前找一个就行。若s[i-dp[i-1]-1]=='(' 则 dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2
代码:
class Solution {
public:
int longestValidParentheses(string s) {
int n=s.size();
int dp[n+7];
int M=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
if(s[i-1]=='(')
{
dp[i]=0;
}
else
{
if(i>=2&&s[i-2]=='(')
{
dp[i]=dp[i-2]+2;
}
else if(i>=(dp[i-1]+2)&&s[i-dp[i-1]-2]=='(')
{
dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2;
}
else
{
dp[i]=0;
}
}
M=max(M,dp[i]);
}
return M;
}
};