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;
    }
};

 

 

posted @ 2016-10-20 14:59  一条码虫  阅读(149)  评论(0编辑  收藏  举报