问题引入:给定一个长度为
当然该问题有多种求解方法:暴力枚举(
Manacher 算法
我们设
Manacher 算法可以以线性时间复杂度计算出
首先我们考虑朴素算法:对每一个中心位置
cpp
vector<int> d1(n), d2(n);
for (int i = 0; i < n; i++) {
d1[i] = 1;
while (0 <= i - d1[i] && i + d1[i] < n && s[i - d1[i]] == s[i + d1[i]]) d1[i]++;
d2[i] = 0;
while (0 <= i - d2[i] && i + d2[i] + 1 < n && s[i - d2[i]] == s[i + d2[i] + 1]) d2[i]++;
}下文仅以计算
