manacher算法处理最长的回文子串(一)
引言
相信大家都玩过折叠纸张,如果把回文串相当于折叠一个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算法处理最长的回文子串(一)的更多相关文章
- manacher算法处理最长的回文子串(二)
在上篇<manacher算法处理最长的回文子串(一)>解释了manacher算法的原理,接着给该算法,该程序在leetcode的最长回文子串中通过.首先manacher算法维护3个变量.一 ...
- hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]
传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...
- Manacher算法--O(n)回文子串算法
转自:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 O(n)回文子串算法 注:转载的这篇文章,我发现下面那个源代码有点bug... ...
- python经典算法题:求字符串中最长的回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- bzoj2565 最长双回文子串
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- leetcode 5 查找最长的回文子串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...
随机推荐
- struts struts拦截器(过滤器)
在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...
- Apache OFBiz 添加样式
1.打开themes文件夹,拷贝一份样式作为自己的样式更改初始样式,我这里拷贝的是flatgrey文件夹,重新命名为qlstyle 2.在文件/ofbiz/framework/common/c ...
- oracle 查询 函数练习2
/*以下代码是对emp表/dept表/salgrade表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr ...
- SqlCommandBuilder的作用
最近看一个案例,关于如何向数据库传数据,颇有发现. 以前我的数据都是采用Sql代码用SqlCommand一条一条语句的传入数据库. 但是今天发现有更好的方法. 代码如下: SqlConnection ...
- A successful Git branching model/GIT分支管理是一门艺术
英文原文:http://www.nvie.com/posts/a-successful-git-branching-model/ 原文作者:Vincent Driessen 本文经Linux大棚博主总 ...
- php_memcahed telnet远程操作方法
一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> <bytes> <dat ...
- Real-Time Rendering.3rd,Radiance与距离无关 的解释
P208,说radiance与距离无关: 想了半天才想明白: 如图,设入射方向l对应的单位solid angle为dw, 则 沿l方向射入表面的radiance=dw范围内射入表面单位面积上的能量. ...
- MSBuild入门(续)
MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充.主要有一下几方面 ...
- Myeclipse10安装git 完美解决-费元星
1. 拥有自己的github版本库 这年头,不在GitHub上弄几个项目都不好意思跟人家打招呼. 首先,进入GitHub注册账号,话说人家这页面做的那叫一个舒服啊. 然后,登陆并创建自己的版本库(Re ...
- Hibernate一级缓存和二级缓存具体解释
一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中.假设短时间内这个 session(一定要同一个ses ...