给你一个字符串 s,找到 s 中最长的回文子串。

1
2
3
4
5
6
7
8
9
10
/*
1. 如果字符串长度小于2,直接返回原字符串
2. 定义两个变量,一个start存储当前找到的最大回文字符串的起始位置
另一个maxLength,记录字符串的长度(终止为止就是start+maxLength)
3. 创建一个helper function 判断左边和右边是否越界,同时左边字符是否符合等于右边字符
上述条件都满足时,再判断是否需要更新 start 和 maxLength,然后left-- right++
继续判断,直到不满足三个条件之一

4. 遍历字符串,每个位置调用 helper function 两遍,分别检查1-i,i+1 和 i,i+1
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var longestPalindrome = function(s) {
if(s.length < 2) return s

let start = 0
let maxLength = 1
let length = s.length

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 < length; i++){
expandAroundCenter(i-1,i+1)
expandAroundCenter(i,i+1)
}

return s.substring(start,start + maxLength)
};