小于 1 分钟
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if (s.length < 2) {
return s;
}
let start = 0;
let maxLength = 1;
// 辅助函数:从中心向两边扩展
// left: 左边界索引, right: 右边界索引
function expandAroundCenter(left, right) {
// 当左右不越界且字符相等时,向外扩展
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--;
right++;
}
// 循环结束时,s[left] !== s[right],或者越界
// 回文串的长度 = (right - 1) - (left + 1) + 1 = right - left - 1
return right - left - 1;
}
for (let i = 0; i < s.length; i++) {
// 情况1:以当前字符为中心(处理奇数长度,如 "aba")
let len1 = expandAroundCenter(i, i);
// 情况2:以当前字符和下一个字符之间为中心(处理偶数长度,如 "abba")
let len2 = expandAroundCenter(i, i + 1);
// 取两种情况中的最大长度
let len = Math.max(len1, len2);
// 如果发现了更长的回文串,更新起始位置和最大长度
if (len > maxLength) {
maxLength = len;
// 根据长度和中心点计算起始索引
// 举例:i=2, len=5 (abcba), start = 2 - 2 = 0
// 举例:i=2, len=4 (abba), start = 2 - 1 = 1
start = i - Math.floor((len - 1) / 2);
}
}
return s.substring(start, start + maxLength);
};