一、二维动态规划,超时
int longestValidParentheses(string s) {
int len=s.length(),maxLen=0;
bool valid[len][len]; //valid[i][j]表示s[i]...s[j]是否是有效字串
memset(valid,false,sizeof(valid));
for(int i=0;i+1<len;i++)
if(s[i]=='('&&s[i+1]==')'){
valid[i][i+1]=true;
maxLen=2;
}
for(int k=3;k<len;k=k+2){//k 表示间隔
for(int i=0;i+k<len;i++){
for(int j=i+1;j+1<i+k;j=j+2)
if(valid[i][j]&&valid[j+1][i+k]){
valid[i][i+k]=true;
maxLen=k+1;
break;
}
}
}
return maxLen;
}
二、一维动态规划
int longestValidParentheses(string s) {
int len=s.length(),maxLen=0;
int dp[len]; //dp[i]表示从s[i]开始的最长有效字串长度
memset(dp,0,sizeof(dp));
for(int i=len-2;i>=0;i--)
if(s[i]=='('){
int j=i+1+dp[i+1];
if(j<len&&s[j]==')'){
dp[i]=j-i+1;
if(j+1<len)
dp[i]+=dp[j+1];
}
maxLen=max(maxLen,dp[i]);
}
return maxLen;
}
三、stack,O(n),从头到尾遍历一遍
int longestValidParentheses(string s) {
stack<int> st;
int maxLen=0,accLen=0;
for(int i=0;i<s.length();i++)
if(s[i]=='(')
st.push(i);
else{
if(st.empty())
accLen=0;
else{
int matchedPos=st.top();
st.pop();
int matchedLen=i-matchedPos+1;
if(st.empty()){
accLen+=matchedLen;
matchedLen=accLen;
}
else
matchedLen=i-st.top();
maxLen=max(maxLen,matchedLen);
}
}
return maxLen;
}