1312. 让字符串成为回文串的最少插入次数
难度困难93
给你一个字符串 s
,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s
成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
示例 1:
输入:s = "zzazz"
输出:0
解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。
package com.nie.o4;/*
*
*@auth wenzhao
*@date 2021/4/15 23:33
*/
public class LEE1312 {
public int minInsertions(String s) {
int len = s.length();
if (len == 0) {
return 0;
}
if (len == 1) {
return 1;
}
int[][] dp = new int[len][len];
for (int i = len - 2; i >= 0; i--) {
for (int j = i + 1; j < len; j++) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i][j - 1], dp[i + 1][j]) + 1;
}
}
}
return dp[0][len - 1];
}
public int minInsertions1(String s) {
int len = s.length();
if (len == 0 || len == 1) {
return 0;
}
int[] dp = new int[len];
for (int i = len - 2; i >= 0; i--) {
int pre = 0;
for (int j = i + 1; j < len; j++) {
int temp = dp[j];
if (s.charAt(i) == s.charAt(j)) {
dp[j] = pre + 2;
} else {
dp[j] = Math.min(dp[j - 1], dp[j]) + 1;
}
pre = temp;
}
}
return dp[len - 1];
}
}