本文介绍一下动态规划之变成回文的最小添加次数相关问题。
1. 让字符串变成回文的最少插入次数
1) 对应Leetcode链接
1312. 让字符串成为回文串的最少插入次数 - 力扣(LeetCode)
2) 题目描述
1.1 解题思路
1) 方法1:暴力递归
对应这种回文串问题了一般都是这个范围上的尝试模型,一般都考虑开头和结尾的情况怎么搞:下面我们以abcd
为例来分析可能性
注意:递归含义是字符串从[L…R]范围上变成回文字符串的最小插入代价
对应abcd
这个字符串我们发现它的开头和结尾不相等,我们可以在a的前面添加一个字符d在加上abc变成回文的最小插入次数:
在d的后面添加一个字符a:
开头和结尾相等:
相应代码实现如下:
1) 方法2:记忆化搜索
记忆化搜索其实是建立在暴力递归的基础之上,使用辅助空间记录暴力递归重复的过程。下一次再遇到就返回重复计算直接缓存中获取答案。
对应代码:
严格位置依赖的动态规划,其实也是根据暴力递归改过来的。我们可以根据暴力递归的可能性得到状态转移方然后填表即可。
由于前面已经分析过可能性了,在这里就不重复了.
相应代码实现如下:
2. 让字符串变成回文的最少插入次数并返回一个结果
1) 对应OJ链接
添加最少的字符让字符串变为回文字符串(1)_牛客题霸_牛客网 (nowcoder.com)
2) 题目描述
3) 解题思路
可能老铁看到这个问题的时候直接傻眼了这改怎么做啊?其实这个问题是可以根据我们上一问的dp表来解决的,我们可以利用dp表回溯回去。根据dp表的告诉我们的答案确定最终字符串的长度。步骤如下:
1.从我们得到答案的位置开始回溯,判断当前位置是来自那种可能性进行还原。
2.如果dp[L][R]==dp[L+1][R]说明是可能在字符串的末尾位置添加了开头的字符。
3.如果dp[L][R]==dp[L][R-1]说明可能是在字符串的开头添加了结尾字符。
4.根据上面的步骤我们就可以还原出一个字符串了,具体请看代码。
4) 对应代码
5) 扩展: 如果我们要求得所有的结果又该怎么做了?
如果我们想要获得所有结果我们需要进行回溯,枚举所有的可能性。具体请看代码。
[参看]:
- 动态规划之变成回文的最小添加次数