【刷题LeetCode】奇妙动态规划——最长有效括号

动态规划的重点推导出状态转移方程

题目描述

先来看下这个题目描述:

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

参阅官方题解中「方法2-动态规划」

题解-初步理解

  • 初始化dp数组,dp[0]*len(s)
  • dp[i]表示以该位元素结尾的最长有效子字符串的长度
  • 在遍历字符串的时候,只要该位是左括号,就保持dp[i] = 0
  • 从后向前推导dp之间的状态转移方程,假设我们现在位于i == 5
    在这里插入图片描述
  • 更新i = 4的位置为2
  • 接下来要判断位是有效子括号对前面那位,即i = 2,发现这也是一对有效子括号
    在这里插入图片描述
  • 那么与5对应的左括号一定不在这个有效对中咯,继续向前寻找,发现dp[0]=0,所以最终有效括号即为这两对dp[2]+dp[4]=4

这个示例没有找到前面所对应的与最后一位匹配的左括号,但是可以帮助我们先理解状态数组,以及如何寻找与i对应的位置,即减去内部的有效子串dp[i-1],我们再看一个示例:

题解-更进一步

“()((())”

  • 初始化这个dp数组,先填入不「镶嵌」的有效子括号对。

在这里插入图片描述

  • 现在我们来观察i = 3,已知基础长度为2,更新dp[6]为2
  • 在上一状态中,我们知道i = 3和i =6中还夹了一对有效子串,并存储在i = 5中,因此
    dp[i] = 2 + dp[i-1],因此dp[5]更新为4.
    在这里插入图片描述
    在这里插入图片描述
  • i = 2时为0&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值