1function manacher(s) {
2 const t = '#' + s.split('').join('#') + '#';
3 const p = new Array(t.length).fill(0);
4 let c = 0, r = 0; // 最右回文的中心与右边界
5 for (let i = 1; i < t.length - 1; i++) {
6 const mirror = 2 * c - i;
7 if (i < r) p[i] = Math.min(r - i, p[mirror]); // 利用对称
8 while (t[i + p[i] + 1] === t[i - p[i] - 1]) p[i]++; // 中心扩展
9 if (i + p[i] > r) { c = i; r = i + p[i]; } // 更新最右
10 }
11 return Math.max(...p); // 最长回文长度
12}