题目:
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
代码:
方法一——使用矩阵那一类的动态规划,结果超时,二维数组动态规划,时间空间复杂度O(n^2):
class Solution {
public:
int longestValidParentheses(string s) {
int len=s.length(),maxlen=0;
//vector<vector<int>> v(len,vector<int>(len,0));
int** v=new int*[len];
for(int i=0;i<len;i++){
v[i]=new int[len];
for(int j=0;j<len;j++){
v[i][j]=0;
}
}
for(int i=1;i<=len;i++){
for(int l=0;l<len-i+1;l++){
int r=l+i-1;
if(s[l]=='('&&s[r]==')'){
if(l+1==r){
v[l][r]=1;
}else if(v[l+1][r-1]==1){
v[l][r]=1;
}else{
for(int m=l+1;m<r;m++){
if(v[l][m]==1&&v[m+1][r]==1){
v[l][r]=1;
break;
}
}
}
}
if(v[l][r]==1){
maxlen=max(maxlen,r-l+1);
}
}
}
return maxlen;
}
};
方法二——一维数组动态规划,时间空间复杂度O(N):
class Solution {
public:
int longestValidParentheses(string s) {
int size=s.length();
vector<int> dp(size,0);
int maxVal=0;
for(int i=1;i<size;i++){
if(s[i]==')'){
if(s[i-1]=='('){
dp[i]=2;
if(i-2>=0){
dp[i]=dp[i]+dp[i-2];
}
}else if(dp[i-1]>0){
if((i-dp[i-1]-1)>=0&&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-dp[i-1]-2];
}
}
}
}
maxVal=max(maxVal,dp[i]);
}
return maxVal;
}
};
想法:
一维数组动态规划,如果碰到了'(',dp[i]=0;如果碰到了')',如果他前面那个等于'(',那么dp[i]=i>=2?dp[i-2]+2:2; 如果他前面那个等于')',判断dp[i-1]是否大于0,如果大于0,那么如果i-dp[i-1]-1>=0且s[i-dp[i-1]-1]=='(',那么dp[i]=i-dp[i-1]-2>=0?dp[i-1]+2,dp[i-1]+2+dp[i-dp[i-1]-2];
重要的是想清楚递推关系式。