解题思路
注释比较长,耐心看,重点一是看懂dp[i]表示的是什么,那就是从j到i的合法子串长度,0 <= j <= i,重点二是j可由等式dp[i] = i - j + 1变形求得,重点三是对贪心法的理解,只取局部最优,按这个思路考虑,每次迭代尾字符要么是(
要么是)
,则:
...(
一定不合法...)
要分情况讨论:...()
一定合法...))
可能合法,继续分情况讨论:...((valid))
,valid表示合法子串,可以为空字符串,一定合法;...((invalid))
,invalid要么是(
,要么是)
- 例如
...((())
,一定是先由1分支处理,取得局部最优解,减小问题规模,再由2.2.1处理 - 再例如
...(()))
一定是先由2.2.1处理变为...valid)
,取得局部最优解,减小问题规模,继续由2处理;
- 例如
可见2.2.2的invalid无论是什么,都可以通过该策略取得局部最优,减小问题规模后重新应用该策略,这是贪心法的特征;
1 | /** |