leetcode 1312. 字符串成为回文串的最少插入次数--题目进阶:添加最少的字符让字符串成为回文串

与牛客CD124题目一致
题目描述:给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。

示例:
输入:“zzazz” 输出:“zzazz”
输入:“abca” 输出:“acbca”

分析:

将此题目分为两步,首先是找到使字符串成为回文串的最少插入次数,再找到合适的位置插入字符即可。

第一步:
  1. 动态规划:当前字符串要变成回文,那只要把不一样的找出来就可以。则求出反转的字符串和当前字符串的最长公共子序列,原字符串长度减去最长公共子序列字符串长度即可。此方法求解整个dp表自顶向下需要完全遍历。
  2. 区间动态规划: dp[L][R] 表示对于字符串 s 的子串 s[L:R](L、R表示左右结尾字符),最少添加的字符数量,使得 s[L:R] 变为回文串。因此可以从外向内对dp表进行求解,分两种情况:
    1、s[L] == s[R],那么最外层已经形成了回文,则向内继续求解 s[L+1:R-1]
    2、s[L] != s[R],则需要在 s[L:R]的末尾添加字符 s[L],向内求解s[L+1:R];或者是在s[L:R]的开头添加字符 s[R],向内求解s[L:R-1]
    状态转移方程:
dp[L][R] = min(dp[L + 1][R] + 1, dp[L][R - 1] + 1)                     if s[L] != s[R]
dp[L][R] = dp[L+ 1][R - 1]                                             if s[L] == s[R]

为了保证在计算 dp[L][R] 时,状态转移方程中的状态 dp[L + 1][R]dp[L][R - 1]dp[L + 1][R - 1] 均已计算过,使用自底向上的遍历方式,L从右往左遍历,RL+1的位置开始向右遍历,因为L==R时表示单个字符不需要添加任何字符串即可构成回文串,初始化的时候初始为0。

第二步:

首先凑出原字符串长度+需要添加长度的字符数组res,原字符串s和结果字符串res同时从两边向内收缩, i, j = 0, n-1; l, r = 0, res_len - 1
如果:原字符串两边相同 s[i] == s[j] 则给结果字符串两边都添加上这个相同的字符res[l] = res[r] = s[j]
否则:比较dp[i+1][j]dp[i][j-1]需要添加的字符串个数,用更短的来拼凑res[l] = res[r] = s[i](或s[j])

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值