题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例 2:
输入: s = "cbbd"
输出: "bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
思路:
- 思路:遍历s ,假设便利到的每一个字符都是回文子串的中心,向两边扩散, 回文字串的长度可能是奇数也可能是偶数(取二者较大值)
help()函数的作用就是传入中心的两个字符(其实还有s,以及res),返回 res和此时中心字符对应的回文串的较长者。- 如果是奇数,初始的中心为
s.charAt(i),显然s.charAt(i)===s.charAt(i),如果是偶数,初始中心为s.charAt(i)和s.charAt(i+1),至于二者是否相等,让help()函数自行判断。 - 向两边持续扩散,直到其中一边到达边界或者对应位置不相等
- slice 函数连头不连尾。
题解:
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if(s.length<2)
return s;
let res = '';
//思路:遍历s 假设s为回文子串的中心,向两边扩散 回文字串的长度可能是奇数也可能是偶数,(取较大值)
for(let i = 0;i<s.length;i++){
//处理奇数
help(i,i);
//处理偶数
help(i,i+1)
}
function help(p,q){
// 循环判断,直到不能满足是回文子串
while(p>0 && q<s.length && s.charAt(p)===s.charAt(q)){
p--;
q++;
}
//最后一次符合条件的时候,p-- q++ 了,额外多操作了一次,可以做一次还原
p++;
q--;
//slice连头不连尾 ,但是此时我们需要尾,因此q++
let str = s.slice(p,q+1);
res = res.length > str.length ? res : str;
//以上四行代码可以优化为两行
//let str = s.slice(p+1,q);
//res = res.length > str.length ? res : str;
}
return res;
};