LeetCode 题解系列(1312):
题目描述:
给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s 成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
示例 1:
输入:s = “zzazz”
输出:0
解释:字符串 “zzazz” 已经是回文串了,所以不需要做任何插入操作。
解法一: 动态规划
- 建立动态规划矩阵 dp[N][N],dp[i][j]代表字符串 s[i..j]成为回文串所需要的最少插入字符数
- 动态规划矩阵的 base case:如果只有一个元素,对应dp矩阵对角线dp[i][i],一定是0;如果只有两个字符,对应dp矩阵dp[j-1][j],如果 s[j-1]==s[j],那么就是 0,否则就是 1
- 动态规划矩阵的一般位置dp[i][j]:分两种情况:1.如果 s[i..j]中 s[i]==s[j],那么 dp[i][j]=dp[i+1][j-1];2.如果不相等,可能是由 s[i+1,j]的基础上在 j 的后面添加 s[i];也可能是在 s[i,j-1]的基础上在 i 的前面添加 s[j],两者取最小的。
- 因为需要依赖同行左边位置,同列下边位置,左下位置,所以从第一列开始计算,并且从下往上进行计算。
- 最终返回 dp[0][N-1] 就是结果。
时间复杂度: O(N^2); 辅助空间复杂度: O(N^2)
1 |
|
LeetCode 题解系列(1312):
http://example.com/2020/07/29/D-DataStructureAndAlgorithm/D-LeetCode/1312-MinInsertionsToPalindrome/