算法简介
manacher 算法是一个求字符串中最长回文连续子序列的算法,可以达到 $O(n)$ 的复杂度。
算法
我们可以在每一个字符之间补上一个 ‘#’ 这样所有的回文串就都会变成长度为奇数的回文串,我们用 $len_i$ 表示从 $i$ 点能够扩展出的回文长度(包括自身)最长是多少,$maxright$ 表示已经触及到的最右边的字符,$mid$ 表示 $maxright$ 所对应的对称轴。
如图:
然后我们发现,$len_i$ 的值至少是 $\min(len_j,maxright-i+1)$ 。然后我们就可以从这个位置开始扩展,直到不能扩展。
复杂度证明
因为 maxright
是单调不减的,所以 while
语句均摊下来仍然是 $O(n)$ 。