版权声明:转载记得声明噢! https://blog.csdn.net/Richard__Luan/article/details/81154909
Manacher是处理回文串的高效算法,其时间复杂度可以达到O(n)
其实可以这么说,马拉车是一种优雅的暴力~~
其优势体现在两点上,第一点是对偶数回文串的处理,第二点是利用已知信息求出未知信息
回文串大家都知道是啥
Able was I ere I saw Elba.
Lewd did I live, and evil I did dwel.
那么怎样判断一个串的最长回文半径呢?
先来O(n3) 的暴力 枚举每一个字串,判断其是否为回文串
O(n2)的暴力,以每一个字符或空隙为回文中心,向左右拓展
马拉车也是根据回文串的特点,省略了大部分重复的计算
我们先解决回文串为偶数的情况
设串为abba 我们在中间填入不可能的字符如'#'
在开头填入另一种字符如‘!’
新串为 !#a#b#b#a#
这样就变成了以字符为回文中心的回文串了
为了方便计算,我们引入一个数组,两个变量
f[i]表示以i字符为中心的回文半径
mx表示在求f[i]之前,最长的回文串的右端点
mid表示最长回文串的长度
求f[i]时,有几种情况
我们无法得知f[i]的信息,只有暴力枚举
第二种
设i关于mid的对称点为j
当mx-i>f[j]时,显然f[j]在这个最长的回文串里
由于对称性,f[i]=f[j]
第三种
此时f[i]>=mx-i
向两边拓展即可
证明一下时间复杂度 i是线性的,mx只会只会向右拓展n次,总时间复杂度O(n)
附上代码