已知题目描述为
给你一个字符串 s
,找到 s
中最长的回文子串。
例如:b a b a d的最长回文子串即是a b a
c b a a b d的最长回文子串即是 b a a b
不难看出其实对于一个字符串的最长回文子串,实际上就是要找到一个‘中线’,往两边搜索,是否存在相同的字符
整体思路如下:
1.对于字符串长度小于2的字符串,直接return
2.需要创建两个变量,一个maxLen存储回文字符串的长度,一个start存储该回文子串出现的位置
3.封装一个函数,开始对每个位置进行‘中线’搜索,其中需要满足几个条件
- 左右边界不越界
- 左右两个字符相同
4.当满足以上条件的时候,需要判断是否要更新maxLen的长度,也就是是否有满足条件的更长字符串,满足的话更新maxLen,并且记录当前字符串的起始位置start
5.对字符串进行遍历搜索,并且需要考虑字符串长度为奇数和偶数的两种情况
代码如下
var longestPalindrome = function(s) {
if(s.length < 2) return s
let maxLength = 1;
let start = 0;
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++;
}
}
//因为helper function已经考虑过越界问题,所以循环遍历的时候,i从0开始取,不用担心越界问题
for(let i = 0; i < s.length; i++){
expandAroundCenter(i, i + 1);
expandAroundCenter(i - 1, i + 1);
}
return s.substring(start, start + maxLength);
};
感谢大家的阅读,有问题欢迎讨论