字符串中最长的回文

dev*_*r87 10 javascript algorithm palindrome

我编写了以下函数来查找字符串中最长的回文.它工作正常,但它不适用于像"中午"或"更红"的单词.我摆弄并改变了for循环中的第一行:

var oddPal = centeredPalindrome(i, i);
Run Code Online (Sandbox Code Playgroud)

var oddPal = centeredPalindrome(i-1, i);
Run Code Online (Sandbox Code Playgroud)

现在它有效,但我不明白为什么.我的直觉是,如果你正在检查一个奇怪的回文,它将在开始时有一个额外的字符(我把它白板化了,这就是我得出的结论).我的推理是否在正确的轨道上?

var longestPalindrome = function(string) {

  var length = string.length;
  var result = "";

  var centeredPalindrome = function(left, right) {
    while (left >= 0 && right < length && string[left] === string[right]) {
      //expand in each direction.
      left--;
      right++;
    }

    return string.slice(left + 1, right);
  }; 

  for (var i = 0; i < length - 1; i++) {
    var oddPal = centeredPalindrome(i, i); 
    var evenPal = centeredPalindrome(i, i);

    if (oddPal.length > result.length)
      result = oddPal;
    if (evenPal.length > result.length)
      result = evenPal;
  }

  return "the palindrome is: " + result + " and its length is: " + result.length;
};
Run Code Online (Sandbox Code Playgroud)

更新:在Paul的精彩回答之后,我认为为了清晰起见改变这两个变量是有意义的:

var oddPal  = centeredPalindrome(i-1, i + 1);
var evenPal = centeredPalindrome(i, i+1);
Run Code Online (Sandbox Code Playgroud)

Pau*_*oub 7

你有它向后 - 如果你输出"奇怪"的回文(你的修复),你会发现它们实际上是偶数长度.

想象一下"中午",从第一个"o"(左和右)开始.匹配,然后你移动他们 - 现在你比较第一个"n"和第二个"o".不好.但是通过修复,你开始比较两个"o",然后转到两个"n".

示例(带var oddPal = centeredPalindrome(i-1, i);修复):

var longestPalindrome = function(string) {

  var length = string.length;
  var result = "";

  var centeredPalindrome = function(left, right) {
    while (left >= 0 && right < length && string[left] === string[right]) {
      //expand in each direction.
      left--;
      right++;
    }

    return string.slice(left + 1, right);
  };

  for (var i = 0; i < length - 1; i++) {
    var oddPal = centeredPalindrome(i, i + 1);

    var evenPal = centeredPalindrome(i, i);

    if (oddPal.length > 1)
      console.log("oddPal: " + oddPal);
    if (evenPal.length > 1)
      console.log("evenPal: " + evenPal);

    if (oddPal.length > result.length)
      result = oddPal;
    if (evenPal.length > result.length)
      result = evenPal;
  }
  return "the palindrome is: " + result + " and its length is: " + result.length;
};

console.log(
  longestPalindrome("nan noon is redder")
);
Run Code Online (Sandbox Code Playgroud)