解法1:利用逆序动态规划。dp[i]存储从i到s.size()-1的最长包含i的数,从n-2到1递推即可,且匹配时要考虑把后面的接上
1 class Solution {
2 public:
3 int longestValidParentheses(string s) {
4 int len = s.length();
5 if(len<2)
6 return 0;
7 int max = 0;
8 int *dp = new int[len];
9 for(int k = 0;k<len;k++)
10 dp[k] = 0;
11 for(int i = len-2;i>=0;i--)
12 {
13 if(s[i] == '(')
14 {
15 int j = i+1+dp[i+1];
16 if(j<len && s[j] == ')')
17 {
18 dp[i] = dp[i+1] + 2;
19 if(j+1<len)
20 dp[i] += dp[j+1];
21 }
22 if(dp[i]>max)
23 max = dp[i];
24 }
25
26 }
27 return max;
28 }
29 };
解法二:利用stack,存储一个bool数组标记匹配的数组,最后遍历连续的true即可。
class Solution {
public:
int longestValidParentheses(string s) {
bool* a=new bool[s.size()];
memset(a,false,s.size());
stack<int> st;
for(int i=0;i<s.size();i++){
if(s[i]=='(') st.push(i);
else if(s[i]==')'&&!st.empty()){
a[i]=true;
a[st.top()]=true;
st.pop();
}
}
int cur_num=0;
int max_num=0;
for(int i=0;i<s.size();i++){
if(a[i]==true)
cur_num++;
else
cur_num=0;
max_num=max(cur_num,max_num);
}
return max_num;
}
};