以5为分界线,向两侧行走双指针
画勾的可以两两配对一条船了,画叉的进一步分析
左边的叉可以两个一组,右边的只能一个一条船
注意:相比较从两侧往中间走,这个不用挨个遍历,更简便
2.
dp表表示i到j范围上最长回文子序列,存在四种可能性:
3.
-
求dp表
存在三种可能性:
a. 先搞定i前面的字符,然后添一个和i一样的,即dp[i][j]=dp[i+1][j]+1
b. 先搞定j后面的字符,然后添一个和j一样的,即dp[i][j]=dp[i][j-1]+1
c. 若i=j,则dp[i][j]=dp[i+1][j-1] -
得到整个表后回推答案
从右上角开始往回推,发现0到7范围的答案来自1到7,说明index=10的位置等于index=0,依此类推。
注意:如果用户只需要最后的答案,则可以空间压缩,但如果需要路径还原则不能
但是上述需要遍历求解验证回文,则过程时间复杂度是O(
N
3
N^{3}
N3),可以优化valid过程:
- dp[i]表示i到最后的位置最小切割数
- dp[i] = chas.length-i表示后面的字符串都不存在回文,即i到最后位置每个位置都需要切一下
dp[i][j]表示i到j范围到底有多少种保留方案。
- 注意dp表中每个单元可能代表两种情况,即可能重复
- 对于情况1,若i不等于j,则只考虑情况2,3,4,但若有情况1,则情况1为: