文字列中で最も長い回文を見つけるために次の関数を書いた。それはうまく動作しますが、それは "正午"や "赤い"のような言葉のために動作しません。私の周りいじっからfor
ループの最初の行を変更:文字列中の最長の回文文字列
var oddPal = centeredPalindrome(i, i);
var oddPal = centeredPalindrome(i-1, i);
をし、今では動作しますが、私は理由上明確ではありませんよ。私の直感は、あなたが奇妙な長さのパリンドロームをチェックしている場合、最初に余分なキャラクターが1つあることになります(私はそれをホワイトボードに出しました。私の推論で正しい軌道にいるのだろうか?
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);
はい - それは最後に意味があります。もちろん、あなたは "中心"がオッズのために1の代わりに2になるので、EVEN回文のi + 1を行うでしょう。ありがとう! – devdropper87
これは、上記の編集をより直観的にするかもしれないと思います。var oddPal = centeredPalindrome(i-1、i + 1); var evenPal = centeredPalindrome(i、i + 1); – devdropper87
この問題の高速直線時間アルゴリズムが['Manacher's algorithm'](https://en.wikipedia.org/wiki/Longest_palindromic_substring)として知られています。 – Blastfurnace