力扣中等题:5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例 2:
输入: s = "cbbd"
输出: "bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
找回文子串时注意,回文子串有奇数位和偶数位,比如aba和bb,用贪心思想,以一个字符串位置为中心像两边扩散,寻找奇数位和偶数位的回文子串,伪代码为:
for 0 <= i < len(s):
找到以 s[i] 为中心的回文串,奇数位的子串
找到以 s[i] 和 s[i+1] 为中心的回文串,偶数位的子串
更新答案
那么直接撸代码:
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let res = ''
for(let i = 0; i < s.length; i++) {
const s1 = help(s, i, i);// 奇数位回文子串
const s2 = help(s, i, i+1);//偶数位回文子串
res = res.length > s1.length ? res : s1
res = res.length > s2.length ? res : s2
}
return res
};
function help(str, left, right) {
while(left >=0 && right < str.length && str[left] === str[right]) {
left--;
right++;
}
return str.substring(left+1, right)// 这是一个关键点,为什么是left + 1呢?
// 带入一个奇数位的子串,str[i] === str[i],所以left--,right++,但是外扩以后str[i-1]可能不等于str[i+1],sustring裁切时,其实位置就不对了,需要修正
}