Manacher算法 最长回文串

Posted 每天都不一样

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Manacher算法 最长回文串相关的知识,希望对你有一定的参考价值。

Manacher算法O(n):主要可以求出以每个字符为中心的最长回文有多长,这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了;这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的重复匹配。

因为对于偶回文,是需要从虚轴扩充,ab,ba,所以如下:

先把原字符串处理,都加上一个标记符,比如#(特殊字符任何都可以,对于计算结果不会有影响)

1221-->#1#2#2#1#

121-->#1#2#1#

按照处理后的字符串求它的最长回文串长度m,所以原始字符串最长子回文串的长度是m/2

 

变量:

1:PArra[] 存放回文半径:某个位置能扩充的回文半径的长度,例如 #1#2#2#1#,2位置PArra[3] = 4

2:int PR 能够扫到的最右的回文的位置   #1#2#1# 在位置3   PR = 6

3:int  index   当 PR更新的时候,index也要更新,指向当前最中心的位置   2中index=3

过程:

当要求位置i的时候的回文半径   分析如下:

1:第一种情况可以直接确定i的回文半径,PR不变,因为没有扩

  

 

 

2:第二种情况,i\'的左边在index左边的左边,PR不用变化,(没有扩)也可以直接确定i位置的回文半径

3:第三种情况,i\'的左边喝index的左边重复,需要从  “右大位置开始继续扩”

如何算复杂度:

如果扩成功了,说明,超过了目前的右大更新PR

4:第四种情况必须暴力扩

 

 

每一次检查的时候,要么失败,要么成功扩,只要成功扩了,PR必须更新,而且最长扩也就2n,所以“扩”的动作和PR高度相关;

通过变量优化这个算法的时候,一般这个复杂度和这个变量的增量有关。

 http://blog.csdn.net/ggggiqnypgjg/article/details/6645824帮助理解

 http://blog.csdn.net/pi9nc/article/details/9251455

 

以上是关于Manacher算法 最长回文串的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法 Manacher 算法求最长回文子串

Manacher算法解决最长回文子串长度问题

最长回文子串问题-Manacher算法建议收藏

最长回文子串问题—Manacher算法

hdu5371 最长回文子串变形(Manacher算法)

Manacher算法—最长回文串