题目
给你一个字符串
s
,找到s
中最长的回文子串。
输入: s = "babad" 输出: "bab" 解释: "aba" 同样是符合题意的答案。
题解
我们这里使用一个叫做从中心扩散的思想,这个思想是指我们遍历字符串中的每一个字符,我们这里把字符串中的第二个字符
a
作为起点,把它当他当成一个中心,往两边扩散,并且检查它的左边和右边的字符是否相等,如果相等的话,这就是我们找到的回文字符串,然后再向两边扩散,在进行判断a
字符左右两边各相隔一个字符的2字符是否相亲,如果相等在扩散,如果不相等则停止更换中心起点,以此往复,并不是所有的回文字符串都有一个中心点,有的回文字符串有中心的,有的回文字符串则没有中心点,所以我们需要处理这两种情况,首先我们写一个判断条件,判断当前传入的字符长度是否小于2,如果小于2则直接放回原字符串,在定义两个变量,start
变量存储于当前找到的最大回文字符串的起始位置,maxLength
记录了最大回文字符串的长度,终止位置也就是start
变量加上maxLength
变量,每次我们找到一个更大的回文字符串都需要更新一下start
变量和maxLength
变量的值,然后在创建一个helper
函数,作用域判断左边和右边是否越界,越界则停止,同时判断最左边的字符串是否等于最右边的字符,如果以上三个字符的三个条件都满足,则判断是否需要更新回文字符串中最大长度以及最大字符的起始位置,然后继续向两边扩散,直到不满足三个条件之一停止,我们在进行遍历字符串时需要调用helper
函数两遍,第一遍是检查中心点的左右两边的字符是否越界和是否相等,第二遍是检查中心点和右边的字符是否越界和是否相等
var longestPalindrome = function(s) { if(s.length<2){ return s; } //maxLength是处理两个字符的情况,每个单个字符都可以被当做一个回文字符串,所以长度初始化为1 let start=0,maxLength=1; function helper(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++){ helper(i-1,i+1) helper(i,i+1) } return s.substring(start,start+maxLength) };