leetcode 32. 最长有效括号

一、题目

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”

二、解法

思路:动态规划
d p [ i ] dp[i] dp[i]表示以 s [ i ] s[i] s[i]结尾的有效子串的最长长度。考察 s [ i ] s[i] s[i] s [ i − 1 ] s[i-1] s[i1]

  • s [ i ] = = ( s[i]==( s[i]==(,则 d p [ i ] = 0 dp[i]=0 dp[i]=0
  • s [ i ] = = ) s[i]==) s[i]==),则考察前一位:
    • s [ i − 1 ] = = ( s[i-1]==( s[i1]==(:则 d p [ i ] = d p [ i − 2 ] + 2 dp[i]=dp[i-2]+2 dp[i]=dp[i2]+2
    • s [ i − 1 ] = = ) s[i-1]==) s[i1]==),则要考虑 s [ i ] s[i] s[i]前面有效子串 t t t的前一位是否是(
      • 如果不是,说明 s [ i ] s[i] s[i]和它不能配对,则 d p [ i ] = 0 dp[i]=0 dp[i]=0
      • 如果是,说明可以配对,则 d p [ i ] = d p [ i + 1 ] + 2 + d p [ i − d p [ i − 1 ] − 2 ] dp[i]=dp[i+1]+2+dp[i-dp[i-1]-2] dp[i]=dp[i+1]+2+dp[idp[i1]2],要特别注意还需要加上 d p [ i − d p [ i − 1 ] − 2 ] dp[i-dp[i-1]-2] dp[idp[i1]2],比如"()(())",dp依次是020026
class Solution {
public:
    int longestValidParentheses(string s) {
        int n=s.length();
        vector<int> dp(n,0);
        int ans=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-dp[i-1]-1]=='('){
                        dp[i]=dp[i-1]+2+(i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0);
                    }
                }
                
                ans=max(ans,dp[i]);
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值