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

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

思路
动态规划: 主要是要状态转移方程
P(i,j)=(P(i+1,j−1)&&S[i]==S[j]),其中由于p(i,j)之前要知道p(i+1,j-1),因此遍历时采用由后往前遍历。
回文子串长度为1和2时,单独考虑。

string longestPalindrome(string s) {int len = s.size();vector<vector<int>> dp(len, vector<int>(len));string res = "";//p(i,j) = (p(i+1,j-1) && s[i] == s[j])   for(int i = len-1; i >=0; i--){for(int j = i; j < len; j++){dp[i][j] = (s[i] == s[j]) && (j - i < 2 || dp[i+1][j-1]);//比较长度if(dp[i][j] && j-i+1 > res.size()){res = s.substr(i, j-i+1);} }}return res;}

其它方法
中心扩展
因为回文字符串是中心对称的。因此以各中心向两边扩展比较是否相等,判断是否是回文。包含奇数和偶数一共有n+n-1个中心;
Manacher’s Algorithm 马拉车算法
其思想也是利用了中心扩展法,不过在它的基础上充分利用了回文特点。先将原字符串进行变换,如下

原字符串:    abc
改变后:     #a#b#c#

其次重点理解maxRight,center这两个变量。
  maxRight 是指已出现的回文字符串最右边字符的索引。center是对于的回文中心。这两者是一一对应的。
  在遍历过程中,当遍历到 i 时,需要判断 i 和 maxRight的大小。
  i >= maxRight  这时,只需按照中心扩展法即可
  i < maxRight  因为回文对称的特点,找到 i 对关于center对称的点 mirror , p[mirror]为扩展步数。如果 p[mirror]+i < maxRight ,p[i] = p[mirror] (注:i 和 mirror 是镜像对称的,在没超出center 为 中心的回文字符串时,因此 mirror 点是回文长度等于 i 点)。否则p[i] 暂时等于maxRight-i。后面继续中心扩展计算。

string longestPalindrome(string s) {//变换字符串,插入'#'int len = s.size();string news = "#";for(int i = 0; i < len; ++i){news += s[i];news += '#';}int slen = 2* len +1;       //变化后字符串的长度int maxRight= 0;            //回文右边扩展最大的索引int center = 0;             //回文中心int start = 0;              //原字符串回文起始位置int maxLen = 1;             //回文字符串的长度int* p = new int[slen];for(int i = 0; i < slen; i++){p[i] = 0;}for(int i = 0; i < slen; ++i){if(i < maxRight){//找到i 关于center 对称的点int mirror = 2 * center -i;p[i] = min(maxRight-i, p[mirror]);       //需要理解}int left = i - (1+p[i]);int right = i + (1 + p[i]);while(left >= 0 && right < slen && news[left] == news[right] )  //注意边界{p[i]++;left--;right++;}//判断maxRight是否更新if(i+p[i] > maxRight){maxRight = i+p[i];center = i;}//比较回文长度if(p[i] > maxLen){maxLen = p[i];start = (i-maxLen)/2;}}return s.substr(start, maxLen);}

leetcode题库5-- 最长回文子串相关推荐

  1. Leetcode题库 5.最长回文子串(C++实现)

    文章目录 解析 思路 代码 解析 l为字符串长度 Max为最长回文子串长度 Max_R指向最长回文子串头部 Max_L指向最长回文子串尾部 p_r指向当前回文子串头部下标-1 p_l指向当前回文子串尾 ...

  2. python【力扣LeetCode算法题库】5- 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  3. python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)

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

  4. LeetCode:Longest Palindromic Substring 最长回文子串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  5. 【LeetCode 5-中等】最长回文子串(高清截图)

    5. [中等]最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给你一个字符串s,找到s中最长的回文子串. ...

  6. 【LeetCode笔记】5.最长回文子串(Java、动态规划、字符串)

    文章目录 题目描述 解法 & 代码: 思路 题目描述 回文:正着念和倒着念一样. 解法 & 代码: 一开始看到子串,想着可能no.3最长重复子串一样用滑动窗口.不过回文串的判断会很麻烦 ...

  7. LeetCode琅琊榜第二层-最长回文子串问题(动态规划)

    LeetCode_5.最长回文字串 难度:中等 关注博主,持续输出优质算法内容 题目链接 目录 1.暴力求解法

  8. Leetcode:5.longest-palindromic-substring(最长回文子串)

    这道题挺难的,暴力法固然爽,但是仍会超时,优化后也是,可能优化不够把: 从0 - length-1用中心扩展法能保证比暴力法O(n^3)低; 好像官网还给出三个方法,有时间可以细琢磨: #includ ...

  9. 牛客题霸 NC17 最长回文子串

    https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 解决方案 Go Manacher(马拉车)算法 func getL ...

  10. Leecode刷题热题HOT100(5)——最长回文子串

最新文章

  1. 张宏江对话清华“智班”:我想看到更多极客
  2. 提取LSA密码lsadump
  3. 【网】关于 Blog 和 RSS 的全面介绍
  4. delete in ST05 trace - deletion will also lead to many DB access first
  5. Java Word break analysis
  6. ext2 源代码解析之 “从路径名到目标结点” (一)
  7. bash 将二进制转换为十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
  8. R语言学习笔记(一)R语言的基本操作与函数
  9. RTSP,RTP,RTCP的区别
  10. 国外程序员薪资曝光,美国最高,均年薪95879美元
  11. 转《JAVA和C#得相同点和不同点》
  12. Mysql 的utf8和utf8mb4
  13. 计算机硬件密码,计算机硬件技术基础综合性实验任务书(08)密码门锁的模拟_C
  14. ASP.NET 将Excel导入数据库
  15. css的重置和原子类的使用
  16. win7 64位系统下载
  17. 微信小程序源码及H5小游戏源码内核构建方法
  18. 研究生学历,毕业就给房!给户口!
  19. rstudio查询命令_RStudio终端操作
  20. 当女生成为软件测试员,我才发现年薪30W+其实并不难…

热门文章

  1. python怎么操作_python怎么操作mysql
  2. Available Packages检索框里显示为nothing to show的解决办法
  3. 【超简单已实现】CSDN实现点击跳转到指定段落
  4. C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
  5. python发QQ邮件
  6. ESP32烧录bin,乐鑫下载工具使用flash_download_tool
  7. C++继承机制(中篇)
  8. 敏捷开发绩效管理之五:敏捷开发生产率(上)(故事点估算)
  9. 火星人谚语系列之八:少读书,多思考
  10. duliu——思维+线段树