/** * @param {string} s * @return {string} */ functionfindLongestPalindrome(str) { // 拼接字符串(拼接后字符个数为奇数个) let tempStr = `^#${str.split('').join('#')}#$`; // 记录一个数组p,记录分别以每个字符为中心的最长回文串长度 let p = newArray(tempStr.length).fill(0); let max = 0, maxIdx = 0; let center = 0, right = 0;
for (let i = 1; i < tempStr.length - 1; i++) { // 马拉车优化1:设当前已知最长回文为a // 若i没超出a的右边界,那么i关于当前已知最长回文的中心点的对称点为i_mirror // 以i与i_mirror为中心的最长回文两者相关。 // 设i_mirror为中心的最长回文半径为p[i_mirror],若i+p[i_mirror]>right,则超出的部分在对应i-p[i_mirror]上不一定相等。 // 所以这里以右边界取了最小值 if (i < right) { p[i] = Math.min(right - i, p[center - (i - center)]); }