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^ ...
随机推荐
- Telnet使用
#使用telnet telnet #使用telnet,并连接到[ip] [port] telnet [ip] [port] baidu zone - telnet使用方法
- 【Linux设备驱动程序】Chapter 1 - 概述
设备分类 字符设备.块设备.网络接口 字符设备 能够像字节流(类似文件)一样被访问的设备. 字符设备驱动程序通常至少要实现 open.close.read 和 write 系统调用. 举例:字符终端( ...
- 为centos桌面增加在右键中打开终端
万万没有想到这只是安装一个程序的总是,而不是配置的问题.注意要用root身份才能安装软件 1. yum -y install nautilus-open-terminal 2. reboot
- centos 中GTK的安装
centos 中GTK的安装 yum install gtk*
- 浏览器 UserAgent
IE Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; .NET C ...
- Java并发编程(二):JAVA内存模型与同步规则
一.Java内存模型(JMM) 它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.一个线程如何和何时能看到其他线程共享变量的值,以及在 ...
- vsftp 虚拟用户高级设置(转载)
发布:xiaokk 来源:net [大 中 小] vsftp 虚拟用户高级设置 本文转自:http://www.jbxue.com/article/1724.html 1.安装所需软件包 ...
- Atitit.减少http请求数方案
Atitit.减少http请求数方案 1. 原理与方法1 1.1. -------jsp1 1.2. "index/js.txt";2 1.3. connReduceDync2 1 ...
- 龙芯CAN测试(sja1000)
测试方案 CAN0和CAN1相连,互相收发数据.连接方式如下图: 使用扩展模式CAN1发送数据CAN0接收数据. 使用标准模式CAN1发送数据CAN0接收数据. 使用EJTAG中bin文件夹内的can ...
- 为什么 Objective-C 很难
转自:http://www.oschina.net/question/213217_41058 作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题.他们总在想快速 ...