添加字符构造回文

给你一个字符串,可以从任何位置添加字符

问至少添加几个可以构造成回文串

 

 

这是一个从范围上尝试的模型

 

 

 

所有范围上尝试的模型,对角线和倒数第二条对角线都非常好填,因为范围最窄 

 

 

 

分析普遍位置,想让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长度的数组

     

 

 

  

 

 

 

 

 任何一个动态规划表,管你要路径的问题,都可以从动态规划表最后一个位置倒推回去得到答案

如果有多条路都可以走,那选其中一条,那么得到一个路径,或走一个深度优先遍历,得到所有的路径

 

posted @ 2021-11-06 11:34  sherry001  阅读(162)  评论(0编辑  收藏  举报