1、前言
题目描述2、思路
关于回文串的问题,好像都可以定义一个数组 dp[i][j],表示字符串 s[i ... j] 的最小某某 之类的。
3、代码
int minInsertions(String s) {
int n = s.length();
// 定义:对 s[i..j],最少需要插入 dp[i][j] 次才能变成回文
int[][] dp = new int[n][n];
// base case:i == j 时 dp[i][j] = 0,单个字符本身就是回文
// dp 数组已经全部初始化为 0,base case 已初始化
// 从下向上遍历
for (int i = n - 2; i >= 0; i--) {
// 从左向右遍历
for (int j = i + 1; j < n; j++) {
// 根据 s[i] 和 s[j] 进行状态转移
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i + 1][j], dp[i][j - 1]) + 1;
}
}
}
// 根据 dp 数组的定义,题目要求的答案
return dp[0][n - 1];
}
网友评论