一、题目描述
二、题解
本题我们利用动态规划的思想来解决。
1、状态表示
首先创建一个dp数组,dp[i][j] 表示的是将字符串 s 的 [ i, j ] 区间的这一子串,变成回文串的最少插入次数。
2、状态转移方程
3、初始化
根据「状态转移方程」,没有不能递推表示的值。
无需初始化
。
4、填表顺序
根据「状态转移方程」,我们发现,在 dp
表所表示的矩阵中,
dp[i + 1]
表示下一行的位置,
dp[j - 1]
表示前一列的位置。因此我们的填表顺序应该是
从下往上填写每一行,每一行从左往右
。
5、返回值
最后返回dp[0][n-1]的值即可。
三、 解题代码
class Solution {
public int minInsertions(String s) {
int n = s.length();
//创建dp表
int[][] dp = new int[n][n];
//无需初始化
//填写dp表
for(int i = n-1; i >= 0; i--) {
for(int j = i; j < n; j++) {
if(s.charAt(i) == s.charAt(j)) {
if(i == j) {
dp[i][j] = 0;
}else if(i + 1 == j) {
dp[i][j] = 0;
}else {
dp[i][j] = dp[i+1][j-1];
}
}else {
dp[i][j] = Math.min(1 + dp[i][j-1], 1 + dp[i+1][j]);
}
}
}
return dp[0][n-1];
}
}