求解最长回文的问题有多种解法,这里对复杂度为O(n)的Manacher算法进行简单的介绍
Manacher算法
Manacher算法主要解决了两个问题:
- 回文字符串长度奇偶对应的中心不同
- 重复的计算
下面就来看看具体是怎么解决这两个问题的吧!
插入特殊字符
回文字符串可能出现abba, aba两种情况,对于abba其中心点bb,aba中心点为a,那么对于要求解的字符串,通过首尾及间隔插入特殊字符,就可以保证中心一定是1个字符, 同时回文长度均为扩展后的回文半径-1
为什么是扩展后的回文半径-1呢?
假设原回文半径为r
若回文长度为偶数, 则原回文长度为2r, 扩展后的半径为2r+1
若回文长度为奇数, 则原回文长度为2r-1, 扩展后的半径为2r。
很显然,原回文长度恰好是扩展后的半径-1
利用回文的对称性
在求解每个点的回文半径时,记录最右边界的回文,利用其对称性,减少当前点的计算
假设: 当前点为P, 最右回文边界为MR, 其中心点为C
根据P点的位置,可分为以下几种情况进行计算:
- P>=MR : 与一般解法一致,以P为中心两侧扩散,求其回文半径,并更新最右边界
- P<MR, 此时可利用对称性减少计算,设其关于C的对称点为P’, P’的最左边界为P’L,则又分为三种情况:
-
P’的左边界在C左边界内, 即 P’L > 2C-MR, 则 r( P) = r(P’)
-
P’的左边界在C左边界之外,即P’L < 2C-MR, 此时r( P) = MR-P , 这种情况下,在C的半径范围外P和P’ 的半径一定是不对称的,否则C的边界就不是MR了
-
P’的左边界恰好落在C的左边界,即P’L = 2C-MR, 此时,P的回文半径至少是r(P’) 那么从MR开始往外扩散,随之最右边界更新
-