给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
解题思路
1.如果是回文子串,那么它的左右两边的元素肯定是对称的,可以使用左右指针,从当前元素向两边扩散,以找到最长子串。
2.首先遍历字符串,然后分两种情况来查找当前的最长回文串:
- 寻找长度为奇数的回文子串(以当前元素向两边扩散),如 ‘a’
- 寻找长度为偶数的回文子串(以s[i],s[i + 1])向两边扩散,如 ‘bb’
3.最后再找出长度最长的回文子串返回即可
代码
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let res = '';
const palindrome = (s, l, r) => {
// 左右指针,从s[l]和s[r]向两边扩散,找到最长回文串
while(l >= 0 && r < s.length && s[l] === s[r]) {
l--;
r++;
}
return s.substr(l + 1, r - l - 1);
}
for(let i = 0; i < s.length; i++) {
// 寻找长度为奇数的回文子串(以当前元素向两边扩散)
const s1 = palindrome(s, i, i);
// 寻找长度为偶数的回文子串(以s[i],s[i + 1])向两边扩散
const s2 = palindrome(s, i, i + 1);
res = res.length > s1.length ? res : s1;
res = res.length > s2.length ? res : s2;
}
return res;
};