题目:给一个字符串,找出最长的回文的长度(或求这个回文)。
分析:
寻找字符串中的回文,有特定的算法来解决,也是本文的主题:Manacher算法,其时间复杂度为O(n)。
首先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了。
然后,我们需要一个辅助数组rad[],用rad[i]表示第i个字符的回文半径,rad[i]的最小值为1,即只有一个字符的情况,现在问题转变成如何求出rad数组。
假设现在求出了rad[1,
如图1所示,黑色的部分是一个回文子串,两段红色的区间对称相等。因为之前已经求出了rad[i
图1
① rad[i]
如图1,rad[i
② rad[i]
如图2,rad[i-k]的范围为青色,因为黑色的部分是回文的,且青色的部分在黑色的部分里面,根据定义,很容易得出:rad[i
图2
③ rad[i]
如图,通过和第一种情况对比之后会发现,因为青色的部分没有超出黑色的部分,所以即使橙色的部分全等,也无法像第一种情况一样引出矛盾,因此橙色的部分是有可能全等的。但是,根据已知的信息,我们不知道橙色的部分是多长,因此就需要再去尝试和判断了。
以上就是Manacher算法的核心思想。POJ上有一道关于回文的题目POJ3974,读者了解Manacher算法之后有兴趣可以做做,下面给出该题的Java代码,可以通过。
| import import public } |
参考资料:

本文介绍Manacher算法,一种用于寻找字符串中最长回文子串的高效算法,时间复杂度为O(n)。通过实例讲解算法核心思想,并提供Java实现代码。


626

被折叠的 条评论
为什么被折叠?



