标签:偶数 标记 文字 中心 回文字符串 一个 快速 奇数 等于
马拉松算法:
马拉松算法是用来计算一个字符串中最长的回文字符串(对称字符串,如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