动态规划的重点推导出状态转移方程
题目描述
先来看下这个题目描述:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例
输入: “)()())”
输出: 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&