1、题目描述
给出一个只含有(和)的字符串,返回最长的括号匹配合法的子串。
2、思路
动态规划。
dp[i] 指的是以位置i结尾的最长合法子串的长度。
初始化:dp[i]=0
状态转移:只有s[i]==),dp[i]才有可能大于0.
1)s[i-1]==(,dp[i] = dp[i-2]+2;
2)s[i-1]==),s[i-dp[i-1]-1]==(
dp[i] = dp[i-1]+2;
if i-dp[i-1]-2 >=0
dp[i] += dp[i-dp[i-1]-2];
返回最长的dp[i]。
复杂度O(n)
3、代码
int longestValidParentheses(string s) {
int l = s.size();
if(l==0) return 0;
int ans = 0;
int dp[l] = {0};
for(int i=1;i<l;i++){
if(s[i]==')'){
if(s[i-1]=='('){
if(i==1) dp[i]=2;
else dp[i]=dp[i-2]+2;
}
else{
if(s[i-dp[i-1]-1]=='('){
dp[i]=dp[i-1]+2;
if(i-dp[i-1]-2>=0)
dp[i]+=dp[i-dp[i-1]-2];
}
}
if(dp[i]>ans)
ans=dp[i];
}
}
return ans;
}