引言

相信大家都玩过折叠纸张,如果把回文串相当于折叠一个A4纸,比如ABCDDCBA就是沿着中轴线(D与D之间)对折重合,那么这个就是一个回文串。或者是ABCDEDCBA的中轴线就是E,那么沿着中轴线对折也是重合的,所以这个字符串也是一个回文串。

   判断一个字符串中的最长回文子串,我们可以对每个字符的两边进行比较,还是如何ABCDEDCBA,在A,B,C,D分别为中心轴向两边扩展的回文子串长度都是1,就是它自己本身,当扫描以E为中心轴时,那么这个回文的最长子串时9,也就是这个字符串本身。然而当用相同的方法处理ABCDDCBA时,分别以A,B,C,D为中心轴向两边扩展,得到的最长回文子串的长度是1,实际上最长的回文子串却是ABCDDCBA,就是它自己本身。

  为了解决以上的问题,我们对原来的子串就行填充,比如用'#'来填充,其实任意字符都是可以的。这样原来为N长度的字符串变成了2*N+1的长度。例如ABCDDCBA为例子,填充完新的字符串为#A#B#C#D#D#C#B#A#。这样根据刚才的方法从左往右,以每个字符为中心轴扩展。得到以第5个'#'为中心轴,向两边扩展扫描时,这个回文子串为最大回文子串,即本身。最大回文长度为2*8+1=17,那么原来的最大回文子串长度为17/2=8。

  以上的方法,每次都要以每个字符为中心轴向两边扩展,且扩展长队为1,2,...N/2,则平均时间负责度为O(n^2)。

原理

      1)现在如下图所示,现在已知以idx为中心轴的回文子串的长度为花括号括起来,则现在求以i为中心抽的回文子串长度,首先保证i处于以idx为中心轴的回文串中。那么i的以idx的对称点是i',且i'的回文子串的长度也已知(用括号括起),其中i指向c,i'指向b。(本文的小写字母都是变量,大写字母规定为具体字符)

那么由e为中心的回文子串中得知,b=c。又因为idx的回文不包括a和d,那么a!=d,否则a=d时,以idx的回文子串还要扩展下去。由因为idx左 到b 和 idx右到c 相等的。有因为a!=d,所以以c为中心轴的回文半径只有idx右-location(c)。因为若a关于以b为中心的回文的对称点为a'。a'以e为中心轴的回文的对称点为a''。那么a=a'=a''!=b。

以下面的例子说明

以9号D为中心轴的回文子串的长度为16-2+1=15。他是从2号开始,16号结束。现在也知道以5号B为中心轴的回文子串长度是10-0+1=11。那么13号B的对称点就是5号的B。那么以13号B为中心轴的回文长度是多少?1号D和17号E不相等。现在只要判定以13号B为中心抽的回文子串是否包括17号。若包括17号E,那么它的对称点9号。且9号的对称点是1号D,那么可知17号应该等于9号等于1号,实际上可知1号和17号不相等。所以以13号为中心抽的回文不包括17号E。有根据以5号和9号为中心的回文串可知  2号--5号 ,8号--5号, 10号--13号  16号--13号 都是相等的。

2)下面是第二种情况,若i'的回文串的直径被idx的回文串包含的话。如下图。

已知i关于idx为中心轴的对称点i'的最大回文子串如上图。因为i'的回文子串不包括a,b则a!=b,有因为a,d和b,c分别关于idx对称,记b=c,a=d。所以c!=d。又因为在c和d之间是回文,原因在于c和d之间的字符关于idx的a和b之间对称,且a和b之间是回文串,所以,c和d之间也是回文串。所以i的回文串串的长度和i'相同。例子如下:

3)下面是第三种情况,若i'的回文左边界与idx的回文左边界重合时,如下图。

由idx为中心抽的回文串可知,b=c,a!=d。且i'的回文长度在a到b之间(不包括a,b)。那么i的回文串的长度至少如上图所示。若c=d时,关于i为中心轴的回文还是可以扩展的。若c!=d则刚好是上图所示的括号内。例子如下。(是c=d的这种情况)

i关于idx的对称点i'的最长回文子串如上图,且i'的回文左边界与idx重合,所以i为中心的回文需要充阴影边界开始在往左右两边试着扩展。

  4)第四种情况,就是当i没有被idx为中心的回文包含时,那么我们没有任何信息可以利用,只能以i为中心轴,向左右两边扩展。找出它的最长回文子串。

manacher算法的原理如上所示,代码将在下章给出。

manacher算法处理最长的回文子串(一)的更多相关文章

  1. manacher算法处理最长的回文子串(二)

    在上篇<manacher算法处理最长的回文子串(一)>解释了manacher算法的原理,接着给该算法,该程序在leetcode的最长回文子串中通过.首先manacher算法维护3个变量.一 ...

  2. hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

    传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...

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

    转自:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 O(n)回文子串算法 注:转载的这篇文章,我发现下面那个源代码有点bug... ...

  4. python经典算法题:求字符串中最长的回文子串

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

  5. bzoj2565 最长双回文子串

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...

  6. LeetCode[5] 最长的回文子串

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

  7. leetcode 5 查找最长的回文子串

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

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

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

  9. LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium

    题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...

随机推荐

  1. 贪吃蛇easyx版本

    这学期学了图形交互学,三个星期下来,突然意识到已经可以用c++写一个贪吃蛇了. 于是就用了两天写了这个小游戏. 其中一天写了核心代码,半天找核心代码中的bug,还有半天进行了界面及操作的优化. 但是有 ...

  2. [Oracle] enq: TX - row lock contention 优化案例

    依据开发反馈.近期每天早上7:30应用会报警.应用的日志显示数据库连接池满了.新的连接被拒绝. 首先.我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - r ...

  3. layer弹窗的操作方法

    1.首先去http://layer.layui.com/下载插件 2.在网站上有演示说明 3.操作方法如何 <script src="../js/layer/layer.js" ...

  4. Groovy小结:java调用Groovy方法并传递参数

    Groovy小结:java调用Groovy方法并传递参数 @(JAVA总结) 1. 场景描述 在网上查了资料发现,java有三种方式调用groovy脚本.但是真正在实际的服务器环境中,嵌入groovy ...

  5. freeswitch与外部网关链接

    我建了一个 Freeswitch 内核研究 交流群, 45211986, 欢迎加入, 另外,提供基于SIP的通信服务器及客户端解决方案, 承接 sip/ims 视频客户端开发,支持接入sip软交换,i ...

  6. 点滴积累【C#】---操作文件

    操作文件 写入文件效果: 写入文件代码: private void 保存ToolStripMenuItem_Click(object sender, EventArgs e) { try { File ...

  7. Atitit.atiJsBridge 新特性v7q329

    Atitit.atiJsBridge 新特性v7q329 atiJsBridge 未来计划 Postdata  图像上传的支持 Simp param计划 p1 p2 p3 p4 $method 的si ...

  8. Java接口的异常设计

    一.问题的提出   疑惑1:在设计接口的时,对于接口方法何时需要声明抛出受检异常或者说所有的接口方法最后都声明抛出受检异常? 以下是代码片段: public interface xx{ public ...

  9. firefox配置

    Firefox23取消了一个很人性化的功能,就是在GUI界面中禁用JavaScript,对于这点我很不能理解!JavaScript是所有网页木马 的源头,防人之心不可无,FireFox就这么确信能防住 ...

  10. (转)Python开发规范

    转自:https://www.jianshu.com/p/d414e90dc953 Python风格规范 本项目包含了部分Google风格规范和PEP8规范,仅用作内部培训学习 Python风格规范 ...