1. 程式人生 > 實用技巧 >leetcode32 最長有效括號(Hard)

leetcode32 最長有效括號(Hard)

題目來源:leetcode32 最長有效括號

題目描述:

給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"

示例 2:

輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"

解題思路:

參考題解
使用動態規劃,dp[i]定義為:以s[i]為結尾的子串中,形成的最長有效子串的長度。dp[0]=0。

  1. 如果s[i]是')',判斷s[i-1]
    ① s[i-1]是'('
    如果i-2>=0 ,那麼dp[i]=dp[i-1]+2;否則dp[i]=2;
    ②s[i-1]是')'
    以s[i-1]為結尾形成的最長有效長度為dp[i-1],跨過這個長度(裡面細節不用管,總之它最大能提供dp[i-1]長度),來看s[i-dp[i-1]-1]這個字元:
    s[i-dp[i-1]-1]不存在或為')',s[i]找不到匹配,直接gg,dp[i] = 0
    s[i-dp[i-1]-1]是'(',它和s[i]呼應,有效長度 2 保底,加上跨過的dp[i-1],再加上前方的dp[i-dp[i-1]-2]…等等…s[i-dp[i-1]-2]要存在才行
    s[i-dp[i-1]-2]存在,dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2
    s[i-dp[i-1]-2]不存在,dp[i] = dp[i-1] + 2

  2. 如果s[i]是'(',不能構成有效子串,dp[i]=0;

class Solution {
public:
    int longestValidParentheses(string s) {
        int n=s.size();
        vector<int> dp(n,0);
        int ans=0;
        for(int i=1;i<n;i++){
            if(s[i]==')'){
                if(s[i-1]=='('){
                    if(i-2>=0) dp[i]=dp[i-2]+2;
                    else dp[i]=2;
                }
                else {
                    if(i-dp[i-1]-1>=0&&s[i-dp[i-1]-1]=='('){
                        if(i-dp[i-1]-2>=0)
                            dp[i]=dp[i-dp[i-1]-2]+dp[i-1]+2;
                        else dp[i]=dp[i-1]+2;
                    } 
                }
            }
            else dp[i]=0;
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};