添加字符构造回文
给你一个字符串,可以从任何位置添加字符
问至少添加几个可以构造成回文串
这是一个从范围上尝试的模型
所有范围上尝试的模型,对角线和倒数第二条对角线都非常好填,因为范围最窄
分析普遍位置,想让L到R范围上整体上变成回文串,有多少方案
以上有三种方案,求三种方案的最小,就是答案
如何分析可能性:
考虑开头,结尾,以及开头和结尾共同考虑
第二种解法:一个样本作行一个样本作列的模型
第一个问题:求两个字符串的最长公共子序列问题
子序列是可以不连续的,子串是必须连续的
dp[i][j], str1 0....i,str2 0...j为前缀的最长公共子序列,dp[str.length][str.length]
分析这个最长公共子序列的情况:
1:最长公共子序列,以str1 i为结尾,不以str2 j为结尾 dp[i][j-1].
2: 以str2 j为结尾,不以str1 i为结尾 dp[i-1][j]
3:以str1 i为结尾,以str2 j为结尾 dp[i-1][j-1]+1.
4:不以str1 i为结尾,不以str2 j为结尾 dp[i-1][j-1]
eg:
Math.max(1,2,3,4)
第二个问题:求一个字符串的最长回文子序列
怎么求这个长度?
转化为第一个问题:求两个字符串的最长公共子序列问题 X
那么原问题的答案为str.length-x
添加问题--进阶
给你一个字符串,可以从任何位置添加字符,构造成回文串并返回回文串
如果最少要添加N个字符,才能构造成回文串,则申请一个长度为str.length+N长度的数组
任何一个动态规划表,管你要路径的问题,都可以从动态规划表最后一个位置倒推回去得到答案
如果有多条路都可以走,那选其中一条,那么得到一个路径,或走一个深度优先遍历,得到所有的路径