解题思路:
回文的理解有两个情况,一种是有中心点,往两边扩散,一种是没有中心点往两边扩散
有中心点例子: babad
没中心点例子:cabbad
- 如果字符串长度小于2,返回原字符串
- 定义两个变量,一个start存储当前找到的最大回文字符串起始位置,另一个maxLength记录字符串长度(终止位置就是start+maxLength)
- 创建一个helper function,判断左边和右边是否越界,同时最左边的字符是否等于最右边字符。如果以上3个条件都满足,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置。然后将left--,right++,继续判断,直到不满足三个条件之一 。
- 遍历字符串,每个位置调用helper function两遍,第一遍检查i-1,i+1,第二遍检查i,i+1。(请思考为什么检查两遍?)因为第一遍检查的是有心点的,第二遍则是没有中心点以i为left,i+1为right进行扩散对比
实现代码:
var longestPalindrome = function(s) {
if (s.length < 2) return s;
let start = 0;
let maxLength = 1;
function expandAroundCenter(left, right) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
if (right - left + 1 > maxLength) {
maxLength = right - left + 1;
start = left;
}
left--;
right++;
}
}
for (let i = 0; i < s.length; i++) {
expandAroundCenter(i-1, i+1);
expandAroundCenter(i, i+1);
}
return s.substring(start, start + maxLength);
};