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