x 5. Longest Palindromic Substring
5. Longest Palindromic Substring\
https://m.blog.naver.com/jqkt15/222108415284
With Manacher’s Algorithm
time: O(n)
space: O(n)
/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function (s) {
let newS = '#';
for (const c of s) {
newS += c + '#';
}
let max = 0;
let idx = 0;
const P = new Array(newS.length).fill(0);
let r = 0;
let c = 0;
for (let i = 0; i < newS.length; i++) {
if (r < i) {
P[i] = 0;
} else if (r >= i) {
P[i] = Math.min(P[2 * c - i], r - i);
}
while (i - P[i] - 1 >= 0 && i + P[i] + 1 < newS.length && newS[i - P[i] - 1] === newS[i + P[i] + 1]) {
P[i]++;
}
if (r < i + P[i]) {
r = i + P[i];
c = i;
if (max < P[i]) {
max = P[i];
idx = i;
}
}
}
return newS.substring(idx - max, idx + max + 1).replace(/#/g, '');
};time: O(n^2)
space: O(1) ⇒ O(n) if substring counted
Last updated