leetcode - 32 最长有效括号(DP)

leetcode - 32 最长有效括号(DP)_第1张图片
利用了dp的做法,需要分别讨论六种情况。

class Solution {
public:
    int dp[30005];//dp[..n]表示最后字符下标为n时的最长合法括号
    int longestValidParentheses(string s) {
        dp[0] = 0;int ans = 0;
        if(s[0]=='('&&s[1]==')'){
            dp[1] = 2;ans=2;//预处理
        }
        for(int i=2;i<s.length();i++){
            if(s[i]=='('){//最后一个为),显然0=
                dp[i] = 0;
            }else{
                if(s[i-1]=='('){//”(()“形式
                    dp[i] = dp[i-2]+2;
                }else{
                    int pre = i-1-dp[i-1];//从pre+1..n-1都是合法序列,找到第一个要判别的
                    if(pre<0){//判下特殊情况,例如”())“
                        dp[i] = 0;
                        continue;
                    }
                    if(s[pre]=='('){
                        if(pre<=0)dp[i] = dp[i-1]+2;
                        else dp[i] = dp[i-1]+2+dp[pre-1];//表示pre和n正好构成一个新的括号对,示例”()(())“
                    }
                    else dp[i] = 0;
                }
            }
            ans = max(ans,dp[i]);
        }
        return ans;
    }
};

你可能感兴趣的:(机试,leetcode,算法,动态规划)