最长的有效括号

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.size()<2) return 0;
        int n=s.size();
        
        int res=0;
        vector<int> dp(n,0);
        //dp[i]表示以nums[i]结尾的最长有效子串长度

        for(int i=1;i<n;i++){
            if(s[i]==')'){
                if(s[i-1]=='('){             //"()"
                    dp[i]=((i-2)>=0)?dp[i-2]+2:2;
                }   
                else if(s[i-1]==')'){        //"))"
                    if(i-dp[i-1]-1>=0 && s[ i-dp[i-1]-1]=='('){
                        if(i-dp[i-1]-2>=0){
                            dp[i]=dp[i-1]+2 +dp[i-dp[i-1]-2];
                        }
                        else{
                            dp[i]=dp[i-1]+2;
                        }
                    }
                }
            }
            res=max(res,dp[i]);

        }
        return res;

    }
};

 

posted @ 2020-03-07 18:22  7aughing  阅读(132)  评论(0编辑  收藏  举报