最长回文子串(力扣第五题)
题目描述
给你一个字符串s
,找到s
中最长的回文子串
示例1
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例2
输入:s = "cbbd"
输出:"bb"
思路
-
整体思路是遍历字符串中的每一位,对每一位的左右两面比较看看是否符合回文子串的条件
-
首先对传入的字符串长度进行判断,小于2的话,也就是说只有一个字符或者为空,他们本身就是这个
-
定义两个变量
start
(用来记录回文子串的起点,方便最后截取出来),另一个是maxLength
,记录子串的长度(终止位置是start+maxLength
) -
接下来创建一个方法,在
for循环
遍历字符串的时候不断用这个方法判断是否符合回文子串,以及符合回文子串的起点start
以及长度maxLength
- 在这个方法中首先判断左右是否越界,以及左右两边是否相等,都满足的情况下比较
maxLength
和这个子串的长度,重新判断maxLength
(方法中会传入left
和right
两个参数来判断比较),如果不满足条件左left--
并且right++
,继续判断,直到不满足条件跳出while循环
- 在这个方法中首先判断左右是否越界,以及左右两边是否相等,都满足的情况下比较
-
在
for循环便利的时候
需要调用自己写的函数两边,第一遍检查i-1
,i+1
(用来解决字符串是奇数的情况),第二遍检查i
,i+1
(用来解决字符串是偶数的情况)
代码
var longestPalindrome = function(s) {
if(s.length <= 1){
return s
}
var start = 0;
var maxLength = 1;
var fn = function(left , right){
while (left >= 0 && right < s.length && s[left] == s [right]){
var newLength = right - left +1
if(newLength > maxLength){
start = left
maxLength = newLength
}
right++;
left--
}
}
for(let i = 0 ; i < s.length ; i++){
fn(i,i+1)
fn(i-1, i+1)
}
return s.substring(start,start + maxLength)
};