算法简介

manacher 算法是一个求字符串中最长回文连续子序列的算法,可以达到 $O(n)$ 的复杂度。

算法

我们可以在每一个字符之间补上一个 ‘#’ 这样所有的回文串就都会变成长度为奇数的回文串,我们用 $len_i$ 表示从 $i$ 点能够扩展出的回文长度(包括自身)最长是多少,$maxright$ 表示已经触及到的最右边的字符,$mid$ 表示 $maxright$ 所对应的对称轴。

如图:

然后我们发现,$len_i$​ 的值至少是 $\min(len_j,maxright-i+1)$​​ 。然后我们就可以从这个位置开始扩展,直到不能扩展。

复杂度证明

因为 maxright 是单调不减的,所以 while 语句均摊下来仍然是 $O(n)$ 。