【javaScript算法刷题】力扣第五题:最长回文字符串。超详解版本

327 阅读2分钟
   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进行更新(当然我们指的是想要代码最简洁的情况下,如果代码写得冗余一点其实也是可以的。)