题目

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例 1:输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:输入: "cbbd"
输出: "bb"
复制代码

思路

  1. 暴力法。2层循环嵌套,遍历所有子串。在判断子串是否为回文并对比保存最大的起止下标。通过前后同时截取字符串对比的方式来判断子串是否为回文。如果相等,就向两边靠拢,直对比的下标相等并且值也相等位置。如果不相等,子串非回文。
  2. 中心扩展算法。回文字符串有一个特点,就是左右对称。如果是奇数长度的回文字符串,中间的字符作为对称点,如aba中的a。如果是偶数长度的回文字符串,会以中间两个字符作为对称点,如abba中的bb。那么比较的时候,找到中心点,两边扩展对比就可以了。直到打破对称,通过暂存的历史最长回文子串的起止坐标比对当前长度,如果当前子串的长度较大,更新起止坐标。由于存在奇偶两种长度,对应的中心点不一样,但两种模式都可能产生回问子串,所有匹配的时候两种模式都要进行匹配,并取同一个中心点的两种模式中长度更长的更新起止坐标,这个是编码时需要处理的细节问题。

编码细节问题

1.为了获取最后的子串,需要通过暂存起止坐标startIndex、endIndex。 2.默认奇数匹配方式,通过判断当前元素与其后面的元素是否相等来决定是否满足偶数匹配。

char* longestPalindrome(char* s) {int startIndex = 0 ;int endIndex = 0;int len = strlen(s);for (int i = 0; i < len; i ++) {int frontIndex = i ;int nextIndex = i;bool evenSerech = true;//满足偶数匹配方式if (s[i] == s[nextIndex + 1]) {evenSerech = true;}while (frontIndex > -1 && nextIndex < len && s[frontIndex] == s[nextIndex]) {frontIndex --;nextIndex ++;}int current = --nextIndex  + 1 - ++frontIndex ;if (current > (endIndex + 1 - startIndex)) {startIndex = frontIndex;endIndex = nextIndex;}if (evenSerech) {frontIndex = i ;nextIndex = i + 1;while (frontIndex > -1 && nextIndex < len && s[frontIndex] == s[nextIndex]) {frontIndex --;nextIndex ++;}int current = --nextIndex  + 1 -  ++frontIndex ;if (current > (endIndex + 1 - startIndex)) {startIndex = frontIndex;endIndex = nextIndex;}}}char *p = (char*)malloc(sizeof(char*) * (endIndex + 1 - startIndex));int j = 0;for (int i = startIndex; i <= endIndex; i ++) {p[j ++] = s[i];}return p;
}
复制代码

小结:需要认真的分析回文的特点,回文串分偶数长度与奇数长度两种情况(认真审题并分析题目所求,不能忽略了一些必要的点,这一点很重要,卡时间比较多的是想通过修改起止指针的位置来适配偶数的模式,发现怎么都不能同时适配奇偶两种情况,如果是两类情况不能简单的统一处理的话,要变回单独处理)。另外这题能反转字符串取相同子串的方法(有坑)、动态规划和Manacher 算法来处理,后面再学习学习。

待完善L('ω')┘三└('ω')」....

算法-两最长回文子串相关推荐

  1. Manacher马拉车算法求最长回文子串

    终于把马拉车算法搞明白了!赶紧记录一下. 这个算法用于查找一个字符串的最长回文子串 马拉车算法依次给数组p[i]赋值,马拉车算法的本质就是在每次给数组p[i] 赋值时尝试进行偷懒 例如,当要给p[6] ...

  2. Manacher's algorithms(马拉车算法)最长回文子串

    最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 ...

  3. (算法)最长回文子串

    题目: 求一个字符串的最长回文子串 思路: 1.暴力枚举 最容易想到的就是暴力破解,列举每一个子串,然后根据回文的定义判断是不是回文,找到最长的那个. 求每一个子串的时间复杂度为O(N^2),判断子串 ...

  4. leetcode算法题--最长回文子串

    题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 相关题目:最长回文子序列 动态规划 dp[i][j]表示从i到 ...

  5. 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)

    题干: 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.  回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组 ...

  6. 算法:最长回文子串(js)

    给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题 ...

  7. 统计5个字符串回文个数c语言,第一章 字符串 – 1.5 最长回文子串 - 编程之法:面试和算法心得...

    最长回文子串 题目描述 给定一个字符串,求它的最长回文子串的长度. 分析与解法 最容易想到的办法是枚举所有的子串,分别判断其是否为回文.这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包 ...

  8. 【最长回文子串】Manacher算法详解

    写在前面 manacher算法解决最长回文子串以及变形问题的时间复杂度为O(n). 如果你想囫囵吞枣,只需要使用到该算法,你可以直接把代码拿走:但如果你想深入了解这个算法的工作原理和关键部分解读,还是 ...

  9. 最长回文子串与最长回文子序列

    文章目录 最长回文子串与最长回文子序列 最长回文子串 题目描述 dp解法 从中心扩展 马拉车算法 最长回文子序列 题目描述 dp 解法 递归思想 最长回文子串与最长回文子序列 最长回文子串 LeetC ...

最新文章

  1. C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示
  2. html5 push api,HTML5+ API Reference
  3. 呈现模式_曝光 | 福特Mustang Mach-E将提供三种驾驶模式
  4. jQuery Mobile事件,开发全解+完美注释
  5. 计算机组成原理(白中英) 第七章 课后题答案
  6. DWM1000模块简介
  7. 大厂Android高级多套面试专题整理集合,大厂直通车!
  8. 热切换Log4j日志级别
  9. fMRI数据分析处理原理及方法
  10. 英文邮件中常见的英语缩写
  11. 设置电脑保护视力的颜色
  12. CyanogenMOD移植教程]
  13. python的用途和组成_Python 用法总结
  14. 获取电脑软件的路径(C#)
  15. 解决WSL2报错(请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化[已退出进程,代码为 4294967295])
  16. Linux下的常用的打包和解压缩命令
  17. 浏览器配置异常_浏览器配置错误 设置为可信站点或调整当前浏览器模式
  18. BIOS、UEFI、Boot Loader都是些什么
  19. Sumproduct函数的使用方法
  20. ArduinoNano的人体感应暗光灯

热门文章

  1. C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 通过程序将数据导入到目标数据库中...
  2. SOAP的Could not connect to host in...报错解决方案
  3. dev Gridcontrol控件属性部分
  4. 解决nginx下connect() to 127.0.0.1:3000 failed
  5. 5.7 Components — Sending Actions From Components to Your Application
  6. 设计模式之观察者模式(Java)
  7. Hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)
  8. 3、什么是控制反转(IoC),什么是依赖注入
  9. mysql 1418 存储过程_MySQL自定义函数 1418报错
  10. python 打开网页自动播放视频_html5的video标签自动播放