我寫了下面的函數來查找字符串中最長的迴文。它工作正常,但不適用於像「中午」或「更紅」的單詞。我擺弄周圍,改變了第一線的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;
};
UPDATE: 保羅真棒answer後,我覺得很有道理更改清晰度兩個變量:
var oddPal = centeredPalindrome(i-1, i + 1);
var evenPal = centeredPalindrome(i, i+1);
YES - 那終於有道理了。當然你會爲偶數迴文做i + 1,因爲他們的「中鋒」的賠率是2而不是1。謝謝! – devdropper87
我認爲這可能更直觀,編輯上面也是:var oddPal = centeredPalindrome(i-1,i + 1); var evenPal = centeredPalindrome(i,i + 1); – devdropper87
我只想指出這個問題有一個快速線性時間算法,稱爲[Manacher算法](https://en.wikipedia.org/wiki/Longest_palindromic_substring)。 – Blastfurnace