题目

给定一个字符串S,返回S中最长的回文子串。S最长为1000,且最长回文子串是唯一。

解法

①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的回文子串长度(长度为偶数)。时间为O(N2)。

②另外,有一个很奇妙的算法,称为Manacher算法,参考 http://www.cnblogs.com/daoluanxiaozi/p/longest-palindromic-substring.html ,时间为O(N)。

代码

①直接扩展:

 1 class Solution {
 2 public:
 3     string longestPalindrome(string s) {
 4         int start = 0, max_len = 0;
 5         for(int i = 0; i < s.size(); ++i)
 6         {
 7             int left, right, len;
 8
 9             len = 1;    //以当前字符为中心的回文串
10             for(left = i - 1, right = i + 1; left >= 0 && right < s.size() && s[left] == s[right]; --left, ++right)
11                 len += 2;
12             if(len > max_len)
13             {
14                 start   = left + 1;
15                 max_len = len;
16             }
17
18             len = 0;    //以当前字符以及右边相邻字符为中心的回文串
19             for(left = i, right = i + 1; left >= 0 && right < s.size() && s[left] == s[right]; --left, ++right)
20                 len += 2;
21             if(len > max_len)
22             {
23                 start   = left + 1;
24                 max_len = len;
25             }
26         }
27         return s.substr(start, max_len);
28     }
29 };

②Manacher算法:

 1 class Solution {
 2 public:
 3     string longestPalindrome(string s) {
 4         int slen = s.size();
 5         if(slen == 0 || slen == 1)
 6             return s;
 7
 8         const int nslen = 2 * slen + 3;  //每个字符两边填充#,将奇偶长度的回文串统一处理
 9         string ns(nslen, '#');
10         ns[0]         = '^';     //开始和结尾添加特殊字符,防止越界
11         ns[nslen - 1] = '$';
12         for(int i = 0; i < slen; ++i)
13             ns[2 * i + 2] = s[i];
14
15         int id = 0, mx = 0;  //id为已找到的最右回文串的中心下标,mx为该回文串的最右下标
16         int p[nslen];        //p保存以每个字符为中心的回文串的半径,这个半径值就是去掉填充字符之后实际回文串长度
17
18         for(int i = 1; i < nslen - 1; ++i)
19         {
20             p[i] = mx > i ? min(mx - i, p[2 * id - i]) : 0;  //利用已有信息,给当前字符为中心的回文串赋半径初值
21
22             while(ns[i - 1 - p[i]] == ns[i + 1 + p[i]])      //向两边扩张
23                 ++p[i];
24
25             if(i + p[i] > mx)
26             {
27                 mx = i + p[i];
28                 id = i;
29             }
30         }
31
32         int mid = 0, max_len = 0;
33         for(int i = 1; i < nslen - 1; ++i)       //找出最长的回文串
34             if(p[i] > max_len)
35             {
36                 mid = i;
37                 max_len = p[i];
38             }
39
40         return s.substr((mid - 1 - max_len)/2, max_len);   //求出回文串第一个字符的下标,返回回文串
41     }
42 };

转载于:https://www.cnblogs.com/qieerbushejinshikelou/p/3990309.html

LeetCode题解——Longest Palindromic Substring相关推荐

  1. 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring

    LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...

  2. [LeetCode]--5. Longest Palindromic Substring

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

  3. LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)

    Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...

  4. leetcode 5 :Longest Palindromic Substring 找出最长回文子串

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  5. [*leetcode 5] Longest Palindromic Substring

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

  6. leetcode 5 Longest Palindromic Substring Java JavaScript解法

    题目详情 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...

  7. LeetCode 5.Longest Palindromic Substring 求解

    经典的动态规划问题 动态规划 定义: 是一种在数学.管理科学.计算机科学.经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法.        动态规划常常适用于有重 ...

  8. [LeetCode] 5. Longest Palindromic Substring

    这道题可以用动态规划,但是其实中心枚举更直接并符合逻辑,需要注意的是,以每一个字母为中心查找最大的Palindromic string的时候是有两种情况,第一种是以这个单一字母为中心(aba),第二个 ...

  9. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

最新文章

  1. php函数find的用法,c语言find函数的用法详解
  2. 超图空间数据模型概要1
  3. [JAVA] String常用方法
  4. 【小松教你手游开发】【unity系统模块开发】Unity5.5.2UI打包AssetBundle
  5. SAP CRM WebClient UI WebUI Runtime repository design
  6. 一些非常有用的链接和工具
  7. python 三维地球_用python生成地球运动的动态模拟动态图
  8. 元类--用不上的先了解
  9. 图Graph--拓扑排序(Topological Sorting)
  10. 加快ALTER TABLE 操作速度
  11. 微软发布 OpenJDK 预览版!
  12. 手动解除浏览器跨域限制
  13. 系统补丁不适用计算机,无法安装IE11 安装补丁“此更新不适用于你的计算机”解决办法...
  14. 不用编程,实现ModbusTC方式与AB罗克韦尔的PLC标签方式通讯
  15. python实现下载小说并保存在本地
  16. 古风系统仙侠文推荐_不容错过仙侠文强推:文笔超好,挑灯夜读系列,看完顿觉书荒...
  17. [VBA][EXCEL]插入分页符
  18. PPT打开出错/可尝试修复此演示文稿
  19. MOOS-ivp 实验三 MOOS简介(2)
  20. Python-PyYAML

热门文章

  1. 《LeetCode力扣练习》第14题 C语言版 (做出来就行,别问我效率。。。。)
  2. 算子find_shpe_model参数详解
  3. mysql 添加int列_在MySQL中现有的int列的值中添加字符?
  4. java 写文件 错误码_JAVA-读取文件错误1(错误)
  5. 适合写python的电脑_这篇写给想选计算机专业的学弟学妹们
  6. python方法调用名字不一样_python中调用父类同名方法
  7. linux测试nvme性能,使用Python测试NVMe吞吐量
  8. 实现php实现价格的排序,PHP实现二维数组排序(按照数组中的某个字段)
  9. swing下拉框从mysql_Java Swing JComboBox下拉列表框的示例代码
  10. 记录一下利用ffmpeg将avi转为mp4