var longestPalindrome = function(s) {
//首先我们要了解到,题目要求就算输入为“ac”,它的“a”也符合回文字符串。故初始的maxLength设置为1。
let maxLength = 1
//这里定义的方法内部全局start指针其实是针对最后返回结果时使用的。看下面的代码。
let start = 0
//当输入字符串的长度小于2时,我们将s直接返回出去,因为符合回文的特性。
if(s.length<2){
return s
}
//这个方法的终极思想:中心双指针扩散判断。针对下方i指针遍历的每个位置都对应运行这个方法。
function checkBackMsg(left,right){
//这里的判断思路稍微有点复杂。
//while循环里是一种初级判断,要求left和right指针不越界,并且两指针所指位置的字符相等。
while(left>=0 && right<s.length && s[left] === s[right]){
// 这里的if判断就要求maxLength与当前两指针所对应的回文串的长度相比较。取更长
if(maxLength < right-left+1){
maxLength = right-left+1
//并且在这个条件内把start指针头更新为left。以便后边输出返回时使用。
start = left
}
//在条件外,是要符合回文条件,均需要对两指针进行移动操作。
left--
right++
}
}
for(let i = 0;i<s.length;i++){
//遍历的过程中对方法进行两次调用的原因:把所有情况都判断完整。
//1.把中心点包含进去,中心点为i指针,另一指针为i+1。向外扩散判断。
//2.把中心点i定住为支柱点,它的左右两边(分别为i-1,i+1),向外进行扩散。
checkBackMsg(i-1,i+1)
checkBackMsg(i,i+1)
}
//最后返回出start到start+maxLength范围内的字符即可。(start指针就是最后返回的最准确且长度最大时的起始指针)
return s.substring(start,start+maxLength)
};
看完本文,有些同学可能会问: 那我们在while循环里面的那个if判断可否使用
maxLength = Math.max(maxLength,riight-left+1)
来选出新的maxLength最大值?
答案是不可以的,因为这里我们定义if条件除了要选出新的maxLength之外,还需要更新新的start指针。如果使用上面的Math.max语句就无法对start进行更新(当然我们指的是想要代码最简洁的情况下,如果代码写得冗余一点其实也是可以的。)