码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode 算法 之 马拉松算法(Manacher's algorithm)(未完成)

时间:2017-09-16 15:00:38      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:偶数   标记   文字   中心   回文字符串   一个   快速   奇数   等于   

马拉松算法:
马拉松算法是用来计算一个字符串中最长的回文字符串(对称字符串,如aba abba)。

首先,我们拿到一个字符串S,然后在S中的每个字符之间加#。
例如:S="abcb" T="a#b#c#b"

我们T字符串的每一个T[i]向延伸d个字符 使得 T[i-d,i+d]是一个回文字符串。你会立刻发现,d就是以T[i]为中心的最长回文字符串的长度。

我们建立一个P数组,是的P数组的长度等于T的长度,每一个P[i]的值表示对应的T[i]为中心的最大回文字符串的长度。

如下:

*************************

瞅一下P,我们立刻就能发现最长的回文字符串长度是P[6],对应字符串是"abaaba"。

你有没有发现,加入#之后 以前的奇数回文字符串 和 偶数回文字符串都变得优雅了呢(提示:这仅仅是为了方便讲解,不是算法代码里所必须的步骤)。

现在,想象你在回文字符串"abaaba"的中间画一条线,你会发现P两边的数字也是关于这条线对称的。不仅仅是这个字符串,你试试"aba"也是一样的情况。
这是巧合吗?答说是也是,说不是也不是。这只是在某种条件下才会出现的,不管怎么样,我们已经取得了很大的进步。

让我们来看看更为复杂的字符串"babcbabcbaccba"。

*****************************

 


上图展示一个从P基于T的生成过程,假设你已经完成P的一部分。竖实线标记的是回文字符串"abcbabcba"的正中间C,两个竖虚线标记回文字符串的左边界和右边界。
你在i这个位置,且i位置关于C的镜像位置是i‘。你应该如何能快速计算出P[i]的值呢。

我们看到,i=13,i‘=9,我们需要计算的是P[13]。

*****************************

上图两个绿实线所覆盖的区域关于C对称。我们看一下i的镜像i‘,很显然P[i‘]=P[i]=1。P[i]必然是1,因为

leetcode 算法 之 马拉松算法(Manacher's algorithm)(未完成)

标签:偶数   标记   文字   中心   回文字符串   一个   快速   奇数   等于   

原文地址:http://www.cnblogs.com/qins/p/7516357.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!