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
};

动态规划的思路

posted @ 2021-11-02 17:06  BONiii  阅读(65)  评论(0)    收藏  举报