参考:https://www.felix021.com/blog/read.php?2040,https://segmentfault.com/a/1190000002991199 做了修改。

  首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a#(注意,下面的代码是用C语言写就,由于C语言规范还要求字符串末尾有一个'\0'所以正好OK,但其他语言可能会导致越界)。
下面以字符串12212321为例,经过上一步,变成了 S[] = "$#1#2#2#1#2#3#2#1#";

  原帖中需要用一个数组 P[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度(包括S[i],也就是把该回文串“对折”以后的长度),比如S和P的对应关系:

  S  #  1  #  2  #  2  #  1  #  2  #  3  #  2  #  1  #
  P  1  2  1  2  5  2  1  4  1  2  1  6  1  2  1  2  1
  (p.s. 可以看出,P[i]-1正好是原字符串中回文串的总长度)

但我不采用以上的做法,我的算法思想如下:

从S的下标1开始遍历到下标S.length()-2做如下操作

1) 假设偏移量为offset, 用一个while循环控制在对比 S[i-offset] 和第 S[i+offset] 的字符是否相等,每次循环offset自增,直到S[i-offset] 不等于S[i+offset] 或者i-offset<1或者i+offset>S.length()-1跳出循环。

2) 使用一个变量maxlength记录最长回文子串向左/右扩张的长度,以及一个maxidx记录当前最大回文串的中心位置,判断当前的offset与maxlength的大小,取较大赋值给maxlength。

3) 根据maxidx找到最大回文的中心位置,再根据其maxlength计算出回文串的起始位置以及长度。再使用substr()方法将回文串截取出来。如str.substr(maxidx-maxlength+1,2*maxlength-1);

4) 去掉其中的 ‘#’字符,就得到回文串。

代码如下:

class Solution {
public:
string longestPalindrome(string s) {
//小于1的字符串免处理,直接返回
if(s.size()<=){
return s;
} int len = s.size();
string str = preProcess(s);
//使用一个变量maxlength记录最长回文子串向左/右扩张的长度,以及一个maxidx记录当前最大回文串的中心位置,判断当前的offset与maxlength的大小,取较大赋值给maxlength。
int offset,maxidx = ,maxlength = ;
for(int cur = ; cur < str.size()-; ++cur){
//查找最大回文串
offset = ;
while(cur-offset>= && cur+offset < str.size() && str[cur-offset] == str[cur+offset]) {
++offset;
} //更新maxlength
if(maxlength < offset){
maxlength = offset;
maxidx = cur;
}
} //截取最长回文串
string longeststr = str.substr(maxidx-maxlength+,*maxlength-);
//去除"#"字符
string result = "";
for(int i = ; i<longeststr.size();i++){
if(longeststr[i]!='#')
result+=longeststr[i];
}
return result;
}
private:
//预处理
string preProcess(string s){
string str = "$";
int len = s.size();
for(int i = ; i<len; i++)
{
str+="#";
str+=s[i];
}
str+="#";
return str;
}
};

5_Longest Palindromic Substring(Manacher) --LeetCode的更多相关文章

  1. [LeetCode] Longest Palindromic Substring(manacher algorithm)

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

  2. leetcode 第五题 Longest Palindromic Substring (java)

    Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may ...

  3. 5. Longest Palindromic Substring (DP)

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

  4. LeetCode:5. Longest Palindromic Substring(Medium)

    原题链接:https://leetcode.com/problems/longest-palindromic-substring/description/ 1. 题目要求:找出字符串中的最大回文子串 ...

  5. Leetcode 之Longest Palindromic Substring(30)

    很经典的一道题,最长回文子串,有多种方法. 首先介绍的一种方法是从中间向两边展开.注意区分aba和abba型的回文串:如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断. //从中间向两边展 ...

  6. leetcode:Longest Palindromic Substring(求最大的回文字符串)

    Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...

  7. LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法

    LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...

  8. LeetCode 5_Longest Palindromic Substring

    LeetCode 5_Longest Palindromic Substring  题目描写叙述: Given a string S, find the longest palindromic sub ...

  9. O(n)回文子串(Manacher)算法

    O(n)回文子串(Manacher)算法 资料来源网络 参见:http://www.felix021.com/blog/read.php?2040 问题描述: 输入一个字符串,求出其中最大的回文子串. ...

随机推荐

  1. keepalived深度结合lvs_dr模式

    keepalived与dr模式结合 keepalived介绍 keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能), 这样可以简单 ...

  2. TP5 常用-方法技巧

    1.插入数据成功返回该数据的ID $add=db('user')->insertGetId($data);   //insert($data)  方法获得是插入数据返回的影响条数  2.使用重定 ...

  3. [PHP]接口请求校验的原理

    具体的校验步骤可以自定义,下面是比较直观的一种形式: 1. 客户端:请求参数带上时间,进行首字母排序,连接私钥后,取得加密结果: 客户端请求时带上这个加密结果作为sign参数. 2. 服务端:对sig ...

  4. Java POI读取Excel数据,将数据写入到Excel表格

    1.准备 首先需要导入poi相应的jar包,包括: 下载地址:http://pan.baidu.com/s/1bpoxdz5 所需要的包的所在位置包括: 2.读取Excel数据代码 package S ...

  5. Spring MVC NoClassDefFoundError 问题的解决方法。

    这种情况在有些项目中出现过,但是不是所有项目都会有这种问题,具体原因不详. 解决方法:如果某个pom的类出现这个异常,首先看看父级POM文件是否有这个dependency,然后再看看启动的网站web ...

  6. iOS-AFNetworking封装Get(自定义HTTP Header)和Post请求及文件下载

    前面提到AFNetworking是一个很强大的网络三方库,首先你需要引入AFNetworking三方库:如封装的有误还请指出,谢谢! 1.Get请求 /**Get请求 url 服务器请求地址 succ ...

  7. BZOJ 2986: Non-Squarefree Numbers [容斥原理 二分]

    题意:求第$n \le 10^{10}$个不是无平方因子数 二分答案, 容斥一下,0个质数的平方因子-1个..... 枚举$\sqrt$的平方因子乘上莫比乌斯函数,最后求出无平方因子数的个数取补集 # ...

  8. 3.C++内联函数,默认参数,占位参数

    本章主要内容: 1)内联函数(替代宏代码段) 2)默认参数 3)占位参数 1.C++的内联函数分析 1.1讲解内联函数之前,首先回忆下之前讲的define宏定义: 之前讲过宏定义会经过预处理器进行文本 ...

  9. AMD && CMD

    前言 JavaScript初衷:实现简单的页面交互逻辑,寥寥数语即可: 随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀 问题: 这时候JavaSc ...

  10. 从一个实例学习----FLASK-WTF

    本案例通过实现一个注册页面的编写,来带你了解FLASK-WTF的运用. 主要功能为表单基础的功能--手机号码必须为11位数,且通过数据库查找不能有已经注册的了,密码要求输入两遍且必须一样,且所有内容不 ...