给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd"
输出:"bb"提示:
1 <= s.length <= 1000s 仅由数字和英文字母组成时间复杂度:O(n^2)
空间复杂度:O(1)
const helper = (l, r) => { // 接受 l 指针,和 r 指针
// 符合条件,说明当前左右指针中间的字符串是回文子串, 接着移动两个指针判断
while(l >= 0 && r < s.length && s[l] === s[r]){
l--;
r++;
}
// 跳出 while 循环时,说明已经获取到当前字母的最长回文子串,此时 while 的循环体多执行了一次,所以需要恢复一下
const maxStr = s.slice(l + 1, r - 1 + 1);
if(maxStr.length > max.length) { // 和上次存储的 max 比较长度,更新最新的符合题目的子串
max = maxStr;
}
}
const longestPalindrome = (s) => {
let max = ''; // 存储最长的回文子串
for(let i = 0; i < s.length; i++) { // 循环 s 的每个元素,因为每个元素都可能是回文子串的中心字母
helper(i, i); // 回文子串的长度分 奇偶 两种情况,所以需要判断两次。
helper(i, i + 1)
}
return max
}