先贴一个抄的代码,贪心吧算是。
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size();
if(n == 1)
return 0;
if(n == 2){
if(s[0] == '(' && s[1] == ')')
return 2;
else
return 0;
}
vector<int> dp(n, 0);
int max = 0;
for(int i=1; i< n; i++){
if(s[i] == ')' && s[i-1] == '(' && i>= 2)
dp[i] = dp[i-2] + 2;
if(s[i] == ')' && s[i-1] == '(' && i== 1)
dp[i] = 2;
if(s[i] == ')' && s[i-1] == ')' && s[i-dp[i-1] -1] == '(')
dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2];
if(dp[i] > max)
max = dp[i] ;
}
return max;
}
};
思路就是从最里头的那对括号开始往外扩散,实现上运用的队列。
class Solution {
public:
int longestValidParentheses(string s) {
queue<pair<int, int>> q;
bool *valid = new bool[s.length() + 1];
int imax = -1;
memset(valid, 0, sizeof(bool) * (s.length() + 1));
for (int i = 0; i < int(s.length()) - 1; i ++){
if (s[i] == '(' && s[i + 1] == ')'){
valid[i] = true;
valid[i + 1] = true;
q.push(make_pair(i, i + 1));
}
}
while (!q.empty()){
pair<int, int> parentheses;
parentheses = q.front();
q.pop();
int l = parentheses.first, r = parentheses.second;
while (l >= 0 && valid[l])
l --;
while (r < s.length() && valid[r])
r ++;
if (!valid[l] && !valid[r]){
if (s[l] == '(' && s[r] == ')'){
valid[l] = true;
valid[r] = true;
q.push(make_pair(l, r));
}
else{
l = l + 1;
r = r - 1;
}
}
if(r - l > imax)
imax = r - l;
}
return imax + 1;
}
};