LeetCode_32 最長有效括號

題目描述:
給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入: “(()”
輸出: 2
解釋: 最長有效括號子串爲 “()”
示例 2:

輸入: “)()())”
輸出: 4
解釋: 最長有效括號子串爲 “()()”

思路1:動態規劃
定義dpdp數組,dp[i]dp[i]表示到第ii個字符爲止,有效的括號長度。
由於有效的括號組合最後一個符號一定是右括號")",所以只需要更新所有右括號")“的位置即可。
右括號前一個括號只有兩種可能”(“或”)“即”…()“或”…))"
"…()"這種情況下的狀態轉移方程是dp[i]=dp[i2]+2dp[i]=dp[i-2]+2
"…))"這種情況下的狀態轉移方程是dp[i]=dp[i1]+2+dp[i2dp[i1]]dp[i]=dp[i-1]+2+dp[i-2-dp[i-1]]
第二種情況說明:第一個右括號的有效長度是dp[i1]dp[i-1],與第二個右括號匹配的左括號的下標位置應該是i1dp[i1]i-1-dp[i-1]dp[i]dp[i]的長度應該是第一個右括號的有效長度+2+之前有效的括號長度

class Solution {
public:
    int longestValidParentheses(string s) {
        //dp[i]:到i字符(含)爲止,有效的字符長度
        if(s.size()<2)
            return 0;
        int n=s.size();
        vector<int> dp(n,0);
        int max_len=0;
        for(int i=1;i<n;i++){
            if(s[i]==')'){
                if(s[i-1]=='(')
                    dp[i]=(i>=2?dp[i-2]:0)+2;
                else if(i-dp[i-1]-1>=0&&s[i-1-dp[i-1]]=='('){//下標不越界並且子數組對應的括號是'('
                    dp[i]=dp[i-1]+2+(i-dp[i-1]-1>0?dp[i-2-dp[i-1]]:0);
                }
            }
            max_len=max(max_len,dp[i]);
        }
        return max_len;
    }
};

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章