Manacher(Manacher)
Manacher 算法,又叫“马拉车”,它可以在时间复杂度和空间复杂度都是 O(n)的情况下,求出一个字符串的最长回文串长度。
核心代码
function createString(str: string) {
let ans = '#';
for (const ch of str) ans += ch + '#';
return ans;
}
export function manacher(str: string): string {
if (str.length === 0) return '';
str = createString(str);
const n = str.length;
const max = { id: -1, radius: -1 };
const arr = new Array(n).fill(0);
let ans = str[0];
for (let i = 0; i < n; i++) {
if (i <= max.radius) arr[i] = Math.min(arr[2 * max.id - i], max.radius - i);
let l = i - arr[i];
let r = i + arr[i];
while (l - 1 >= 0 && r + 1 <= n - 1 && str[l - 1] === str[r + 1]) {
l--;
r++;
}
if (r > max.radius) {
max.radius = r;
max.id = i;
}
arr[i] = r - i;
if (ans.length < r - l + 1) ans = str.substring(l, r + 1);
}
return ans.replace(/#/g, '');
}