[Day11]-[动态规划] 让字符串成为回文串的最少插入次数
1312. 让字符串成为回文串的最少插入次数
难度困难 133 收藏分享切换为英文接收动态反馈
给你一个字符串 s
,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s
成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
示例 1:
复制代码
示例 2:
复制代码
示例 3:
复制代码
题解:
复制代码
本文字数:604 字
阅读完需:约 2 分钟
难度困难 133 收藏分享切换为英文接收动态反馈
给你一个字符串 s
,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s
成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
示例 1:
输入:s = "zzazz"
输出:0
解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。
示例 2:
输入:s = "mbadm"
输出:2
解释:字符串可变为 "mbdadbm" 或者 "mdbabdm" 。
示例 3:
输入:s = "leetcode"
输出:5
解释:插入 5 个字符后字符串变为 "leetcodocteel" 。
题解:
func minInsertions(s string) int {
var solution func(str string) int // 解决方案
var min func(x, y int) int
min = func(x, y int) int {
if x < y {
return x
}
return y
}
solution = func(str string) int {
n := len(str)
var dp = make([][]int, n) // 构建tpTable
for i := 0; i < n; i++ {
dp[i] = make([]int, n) // 初始化都是0
}
for i := n - 2; i >= 0; i-- { // 从下往上,从左往右遍历
for j := i + 1; j < n; j++ {
if str[i] == str[j] {
dp[i][j] = dp[i+1][j-1] // 如果已经是回文了 不做任何操作
} else {
dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1 // 如果不是回文 要么在右边插入,要么在左边插入
}
}
}
return dp[0][n-1]
}
return solution(s)
}
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
促进软件开发及相关领域知识与创新的传播
评论