1312. 让字符串成为回文串的最少插入次数
给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s 成为回文串的 最少操作次数 。
== 516 最长回文子序列
//二维dp,时空On^2// 和516换汤不换药func minInsertions(s string) int {n := len(s)dp := make([][]int, n+1)for i := range dp {dp[i] = make([]int, n+1)//dp[i][i] = 1 //少一个初始化 dp[i][i] = 1}for i := n-1; i >= 0; i-- { //倒序遍历for j := i+1; j < n; j++ {if s[i] == s[j] {dp[i][j] = dp[i+1][j-1] //不用插入,本身就是回文串 = 2 + dp[i+1][j-1]} else {dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1 //插一个试试?}}}return dp[0][n-1]}func min(x int, y int) int {if x > y {return y}return x}
//一维,压缩空间
func minInsertions(s string) int {
n := len(s)
dp := make([]int, n)
for i := n-2; i >= 0; i-- {
prev := 0
for j := i+1; j < n; j++ {
temp := dp[j]
if s[i] == s[j] {
dp[j] = prev
} else {
dp[j] = min(dp[j], dp[j-1]) + 1
}
prev = temp
}
}
return dp[n-1]
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
