对于求回文子串*会有以下三种方法:
1.暴力方法:

步骤:枚举所有子串O($n^2$)→ 检查回文O(n)→ 总复杂度O($n^3$)  
判断方法:双指针从两端向中间比对  
可优化的点:若中间子串非回文,则两端添加相同字符仍非回文,得到方法二。  

2.中心扩展法:

操作:枚举中心位置,向两侧扩展直到不匹配  
复杂度:枚举中心O(n),扩展O(n)  
注意点:需区分奇偶长度中心  
可优化的点:可以在每一个字符之间(包括两端)添加字符,让总体变为偶数个。长度关系:新串最长回文子串长度m → 原串长度为m/2的向下取整  

3.马拉车

运算过程如下  
1.填充符号:在原字符串每个字符间插入特殊符号$,首尾也需添加,将奇偶长度统一为偶数  
2.数组定义:  
p[i]:记录处理后字符串以t[i]为中心的最长回文半径  
s[n]:原始字符串存储  
s[2n+5]:预处理后的字符串存储  
3.初始化参数:  
M:当前最长回文中心  
R:当前最长回文右边界  
初始值均设为0  
4.运行步骤:  
当i>R时暴力扩展:P[i]=1  
否则取对称点信息:p[i]=min(p[2M−i],R−i+1)   
中心扩展:检查t[i−p[i]]与t[i+p[i]]是否相等,循环扩展  
更新边界:若i+p[i]−1>R 则更新M=i,R=i+p[i]−1   
5.最终答案:max(p[i])−1   

复杂度为O(n)

标签: none

添加新评论