1. 程式人生 > 其它 >leetcode32.最長有效括號

leetcode32.最長有效括號

leetcode32.最長有效括號

題目

給你一個只包含 '('')' 的字串,找出最長有效(格式正確且連續)括號子串的長度。

用例

輸入:s = "(()"
輸出:2
解釋:最長有效括號子串是 "()"
輸入:s = ")()())"
輸出:4
解釋:最長有效括號子串是 "()()"
輸入:s = ""
輸出:0

求解

方法一:暴力求法

/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function(s) {
    let max_length = 0;
    let len = s.length;
    for(let i=0;i<len;i++){
        let left = 0;
        let right = 0;
        for(j=i;j<len;j++){
            s[j]=="("?left++:right++
            if(right>left){
                break;
            }
            if(right==left){
                if(max_length<j-i+1){
                    max_length=j-i+1
                }
            }
        }
    }
    return max_length
};

方法二:動態規劃

/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function(s) {
    let max_len = 0;
    const len =s.length
    //建立dp[i]陣列
    const dp = new Array(len).fill(0);
    for(let i=0;i<len;i++){
        if(s[i]=='('){
            dp[i]=0
        }else if(s[i]==')'){
            if(i-1<0){
                dp[i]=0
            }else{
                if(s[i-1]=='('){
                    if(i-2<0){
                        dp[i]=2
                    }else{
                        dp[i]=2+dp[i-2]
                    }
                }else if(s[i-1]==')'){
                    if(i-dp[i-1]-1<0||s[i-dp[i-1]-1]==')'){
                        dp[i]=0
                    }else{
                        if(i-dp[i-1]-2<0){
                            dp[i]=2+dp[i-1] 
                        }else{
                            dp[i]=2+dp[i-1]+dp[i-dp[i-1]-2]
                        } 
                    }
                }
            }
        }
        if(dp[i]>max_len){
            max_len=dp[i]
        }
    }
    return max_len
};

動態規劃的思路