Longest Valid Parentheses
解法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; } };