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)
你有它向后 - 如果你输出"奇怪"的回文(你的修复),你会发现它们实际上是偶数长度.
想象一下"中午",从第一个"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)