一、题目:力扣
给你一个字符串
s
,找到s
中最长的回文子串。示例1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例2: 输入:s = "cbbd" 输出:"bb"提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
二、题解
/**
* @param {string} s
* @return {string}
*/
// 中心扩散法
var longestPalindrome = function(s) {
if(s.length < 2) return s
let res = ''
for(let i = 0; i < s.length; i++) {
halper(i, i) // 回文子串长度为奇数时,以当前数为中心,向两边扩散,例如 cbabc, 以 a 为中心向两边扩散
halper(i, i + 1) // 回文子串长度为偶数时,以当前和下一索引值两个数为中心,向两边扩散,例如 abba, 以 bb 为中心
}
function halper(m, n) {
while(m >= 0 && n < s.length && s[m]==s[n]) {
m--;
n++
}
// 注意此处m,n的值循环完后 是恰好不满足循环条件的时刻
// 此时m到n的距离为n-m+1,但是mn两个边界不能取 所以应该取m+1到n-1的区间 长度是n-m-1
if(n-m-1 > res.length) {
// slice也要取[m+1,n-1]这个区间
res = s.slice(m+1, n)
}
}
return res
};
console.log(longestPalindrome('ccbabad')) // bab
console.log(longestPalindrome('b')) // b
console.log(longestPalindrome('ba')) // b
console.log(longestPalindrome('abc')) // a
console.log(longestPalindrome('cc')) // cc
console.log(longestPalindrome('abfhtrldlr')) // rldlr
console.log(longestPalindrome('cbabc')) // cbabc