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
}