题目描述(难度困难)

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。请你返回让 s 成为回文串的 最少操作次数 。

「回文串」是正读和反读都相同的字符串。

示例 1:

输入:s = "zzazz"
输出:0
解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。

示例 2:

输入:s = "mbadm"
输出:2
解释:字符串可变为 "mbdadbm" 或者 "mdbabdm" 。

示例 3:

输入:s = "leetcode"
输出:5
解释:插入 5 个字符后字符串变为 "leetcodocteel" 。

示例 4:

输入:s = "g"
输出:0

示例 5:

输入:s = "no"
输出:1

提示:1 <= s.length <= 500, s 中所有字符都是小写字母。

解题思路1[1]

回文串类问题,自然首先想到双指针

如果头尾的两个指针指向的字符相等,那我们就同时相向移动两个指针,但是如果头尾的两个指针指向的字符不相等,我们就需要插入字符了。这里有两个选择,在头指针的前方插入尾指针指向的字符,移动尾指针;还有就是在尾指针的后方插入头指针指向的字符,移动头指针。

每当头尾指针指向的字符不相同的时候,我们都有这两种选择,最终,我们要求使得区间[0, n]是回文的最小插入次数,我们可以定义,dp[i][j]表示的是使得区间[i, j]是回文的最小插入次数,我们也可以得出递推方程:

s[i] == s[j]: dp[i][j] = dp[i + 1][j - 1]
s[i] != s[j]: dp[i][j] = Math.min(dp[i][j - 1], d[i + 1][j]) + 1

使用记忆化搜索的实现方式,可以减少不必要的考虑。

代码如下:

public int minInsertions(String s) {int[][] memo = new int[s.length()][s.length()];for (int i = 0; i < s.length(); ++i) {Arrays.fill(memo[i], Integer.MAX_VALUE);}return helper(s.toCharArray(), 0, s.length() - 1, memo);
}private int helper(char[] sArr, int left, int right, int[][] memo) {if (left >= right) {return 0;}if (memo[left][right] != Integer.MAX_VALUE) {return memo[left][right];}if (sArr[left] == sArr[right]) {return memo[left][right] = helper(sArr, left + 1, right - 1, memo);}return memo[left][right] = Math.min(helper(sArr, left + 1, right, memo),helper(sArr, left, right - 1, memo)) + 1;}

解题思路2[2]

本题属于516. 最长回文子序列的子题,求的就是不为最长回文子序列的字符个数,所以我们只需要用字符串长度减去最长回文子序列的长度就是最少插入次数了

驭风者:利用动态规划解LeetCode第516题:最长回文子序列​zhuanlan.zhihu.com

代码如下:

class Solution {public:int minInsertions(string s) {int n=s.size();int dp[n][n]={0};//dp[i][j]表示s[i]到s[j]的最长回文串的长度for(int i=n-1;i>=0;i--)//动态规划求s的最长回文串长度{dp[i][i]=1;for(int j=i+1;j<n;j++){if(s[i]==s[j])dp[i][j]=dp[i+1][j-1]+2;elsedp[i][j]=max(dp[i+1][j],dp[i][j-1]);}}return n-dp[0][n-1];//n-s的最长回文串长度 即为 最少插入次数}
};

提交结果:

参考

  1. ^https://mp.weixin.qq.com/s/TAAe-qKQAIDrUSXvzW826w
  2. ^https://leetcode-cn.com/problems/minimum-insertion-steps-to-make-a-string-palindrome/solution/cdong-tai-gui-hua-xin-ping-zhuang-jiu-jiu-by-xiaon/

leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数相关推荐

  1. LeetCode 1312. 让字符串成为回文串的最少插入次数(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符. 请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字 ...

  2. 分割两个字符串得到回文串[抽象--去除具体个性取共性需求]

    抽象 前言 一.分割两个字符串得到回文串 二.双指针 总结 参考文献 前言 抽象去个性留共性,是因为具体个性对于解决问题是个累赘.少了累赘,直击需求,才能进行问题转换或者逻辑转换. 一.分割两个字符串 ...

  3. 最长回文串_第78天——第78题(最长回文串 )

    今天又是阴天,不过阴天凉快,我喜欢. 第78天--第78题(最长回文串) 看题目! 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 ...

  4. LeetCode 1616. 分割两个字符串得到回文串

    文章目录 1. 题目 2. 解题 1. 题目 给你两个字符串 a 和 b ,它们长度相同. 请你选择一个下标,将两个字符串都在 相同的下标 分割开. 由 a 可以得到两个字符串: aprefix 和 ...

  5. C#LeetCode刷题之#125-验证回文串(Valid Palindrome)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3899 访问. 给定一个字符串,验证它是否是回文串,只考虑字母和数 ...

  6. LeetCode简单题之最长回文串

    题目 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 . 在构造过程中,请注意 区分大小写 .比如 "Aa" 不能当做一个回文字符串. 示例 ...

  7. C#LeetCode刷题之#409-最长回文串(Longest Palindrome)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3788 访问. 给定一个包含大写字母和小写字母的字符串,找到通过这 ...

  8. leetcode 探索 数组和字符串 验证回文串

    问题 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, ...

  9. Leetcode题库 125.验证回文串(双指针 C实现)

    文章目录 思路 代码 思路 Func(char c): 用于判断传入是否为大写字母或数字 第一步: 先将小写字母转化为大写字母 第二步: 调整两指针,使得其指向字母或数字 第三步: 判断两指针内容是否 ...

最新文章

  1. Windows Phone 7、XNA的旋转的背景
  2. python读取中文文件报错-Python3 解决读取中文文件txt编码的问题
  3. 金融风控实战——模型融合
  4. 语义分析的一些方法(上篇)
  5. IPO与上市的关系?
  6. UNIX再学习 -- 函数 fork 和 vfork
  7. mabatis传入参数
  8. Go语言中的指针和new(T)函数的使用
  9. Nginx系列(6):Web服务器分析(理论)
  10. 使用SQLyog远程连接数据库
  11. 华硕aura完全卸载_闲谈:记一次华硕电脑维修。
  12. java8分组求和_Java8 stream 中利用 groupingBy 进行多字段分组求和案例
  13. 写函数,计算传入函数的字符串中,数字、字母、空格 以及 其他内容的个数,并返回结果
  14. 删除:大数据取舍之道 - 电子书下载(高清版PDF格式+EPUB格式)
  15. 华为2288服务器不显示BIOS,设置BIOS - RH2288 V3 服务器 V100R003 用户指南 38 - 华为
  16. 中国大学mooc南京航空航天大学民航运输概论章节作业及测试
  17. 微信小程序接入知晓云插件sdk入门
  18. 女装品牌如何做线上产品推广?
  19. arduino液晶显示屏与温湿度传感器连接
  20. HTTP 提交方式有哪些

热门文章

  1. 【解题报告】VijosP1448校门外的树(困难版)
  2. Python自学之路NO.1-Python的安装与配置
  3. SharePoint 2013让页面显示错误
  4. ubuntu下安装 memecache
  5. (zt)Flash与C++交互
  6. php 安装phalcon,安装phalcon
  7. Java selenium 获取表格数据_Java+Selenium 如何参数化验证Table表格数据
  8. java怎么发布版本号_java 实现比较版本号功能
  9. 国庆活动延长三天!快来领取你的数据技术嘉年华门票!
  10. 惊艳二重奏!专家这样用开源软件建立监控体系