leetcode 32.最长有效括号(hard,动态规划)

在这里插入图片描述

本题用动态规划求解,通过积累计算过的有效括号的数量来找以当前字符结尾有效括号的数量。

状态转移方程:

动态规划是以时间换空间的做法,对于计算过的结果保存下来,不再计算;

在本次中dp数组设置为以当前字符结尾的有效括号的数量;

这一题与最长递增子序列那一题dp数组表示的含义大致相同(异曲同工之妙);

分析:

如果当前字符s[i]为’(’,则很明显以该字符结尾的有效括号的数量为0;

如果当前字符s[i]为’)’,

​ 则如果s[i - 1]为’(’,那么dp[i] = dp[i - 2] + 2;

​ 则如果s[i - 1]为’)’,则前一个字符的有效括号数量为dp[i - 1],i - dp[i - 1] - 1表示当前有效括号数量之前的一个字符,如果s[i - dp[i - 1] - 1] = ‘(’,则dp[i] 的有效括号有以下两部分组成:

1.dp[i - 1] + 2

2.dp[i - dp[i - 1] - 2]. (表示dp[i - 1] + 2之前的有效括号的数量)。

代码如下:
class Solution:
    def longestValidParentheses(self, s):

        if len(s) == 0:
            return 0

        dp = [0] * len(s)


        for i in range(len(s)):
            



            if s[i] == ')' and i > 0:
                
                
                if s[i - 1] == '(':

                    dp[i] = dp[i - 2] + 2
                else:


                    if i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(':

                        dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]
            


        return max(dp)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值