leetcode 32 dp

最长有效括号

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses

分析

动态规划
dp[i]代表到i的最长的有效括号,这里的定义一定是包含第i个字符的(动态规划最难的果然是状态定义)
对dp[i]的更新有三种情况

  • 如果s[i]==’(’ ,根据上面的定义,要包括第i个,所以肯定凑不成合法的字符串,dp[i]=0(初始化就为0)
  • s[i]==’)’,那么我们的s[i-1]如果能和它配成一对,那么就是前面的一组加了后面的(),所以dp[i]=dp[i-2]+2 //-> s[i-2] ‘(’ ‘)’
  • s[i]==’)’,如果s[i-1]是’)’,不能凑成一对,那么怎么处理呢,这就是难点,首先看dp[i-1]这部分,这部分已经计算过了就是dp[i-1]个合法的,那第i-1( ‘)’ )个字符就在这里面,那么第i个字符和谁匹配呢,那就是和这些dp[i-1]匹配完了前面的一个索引是 i-dp[i-1]-1匹配,如果是’(’,完美,匹配成功,还要加上索引前面的一片匹配成功的,就是dp[i-dp[i-1]-2];如果是’)’,匹配失败,一败涂地,就直接挂0.
    一开始我还想使用二维数组区间dp,感觉像最长未匹配括号 这个的D,还是答案更清楚!

代码

class Solution {
public:
    int longestValidParentheses(string s) {
        int len=s.length(),m=0;
        vector<int> dp(len,0);
        for(int i=1;i<len;i++)
        {
            if(s[i]==')'){
                int tmp=i-dp[i-1]-1;
                if(i>=2&&s[i-1]=='(')
                    dp[i]=dp[i-2]+2;
                else if(tmp>=0&&s[tmp]=='('){
                    dp[i]=dp[i-1]+2;
                    if(tmp>=1)
                    dp[i]+=dp[tmp-1];
                }
            }
            m=max(dp[i],m);
        }
        return m;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值