我编写了以下函数来查找字符串中最长的回文。它可以正常工作,但对于"noon"或"redder"这样的单词就不起作用了。我尝试了一下,将for
循环中的第一行改为:
var oddPal = centeredPalindrome(i, i);
用于
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);
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;
};
更新: 在Paul的精彩回答之后,我认为为了更清晰明了,改变两个变量是有意义的:
answervar oddPal = centeredPalindrome(i-1, i + 1);
var evenPal = centeredPalindrome(i, i+1);
马拉车算法
。 - Blastfurnace