题目
难度:⭐️⭐️
给你一个字符串 s,找到 s 中最长的回文子串。
示例
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
题解
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if (s.length < 2) {
return s;
}
let start = 0;
let maxLength = 1;
function expandAroundCenter(left, right) {
while(left >= 0 && right < s.length && s[left] === s[right]) {
if (right - left + 1 > maxLength) {
maxLength = right - left + 1;
start = left;
}
left --;
right ++;
}
}
for (let i = 0; i < s.length; i++) {
expandAroundCenter(i-1, i+1)
expandAroundCenter(i, i+1)
}
// String().substring():从字符串中提取到索引(位置)之间的字符,并返回子字符串。
// 不会更改原始字符串
return s.substring(start, start+maxLength);
};
笔记
1、如果字符串长度小于2,直接返回原字符串
2、定义两个变量,一个start存储当前找到的最大回文字符串的起始位置,另一个maxLength记录字符串的长度(终止位置就是start+maxLength)
3、创建一个helper function,判断左边和右边是否越界,同时最左边的字符是否等于最右边的字符。如果以上3个条件都满足,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置。然后讲left--,right++,继续判断,直到不满足三个条件之一
4、遍历字符串,每个位置调用helper function两遍,第一遍检查i-1,i+1,第二遍检查i,i+1i+1