Ho scritto la seguente funzione per trovare il palindromo più lungo in una stringa. Funziona bene ma non funzionerà con parole come "mezzogiorno" o "rosso". I giocherellava intorno e cambiato la prima riga del ciclo for
da:Palindrome più lungo in una stringa
var oddPal = centeredPalindrome(i, i);
a
var oddPal = centeredPalindrome(i-1, i);
e ora funziona, ma io non sono chiare sul perché . La mia intuizione è che se stai controllando un palindromo di lunghezza dispari avrà all'inizio un personaggio in più (l'ho messo in lavagna e questa è la conclusione cui sono arrivato). Sono sulla buona strada con il mio ragionamento?
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: Dopo Paolo impressionante answer, penso che ha senso cambiare entrambe le variabili per la chiarezza:
var oddPal = centeredPalindrome(i-1, i + 1);
var evenPal = centeredPalindrome(i, i+1);
SÌ - che ha finalmente senso. ovviamente si farebbe io + 1 per i palindromi EVEN perché il loro "centro" sarebbe 2 invece di 1 per le probabilità. Grazie! – devdropper87
Penso che questo potrebbe essere più intuitivo, modificando anche sopra: var oddPal = centeredPalindrome (i-1, i + 1); var evenPal = centeredPalindrome (i, i + 1); – devdropper87
Volevo solo sottolineare che esiste un algoritmo di tempo lineare veloce per questo problema noto come [algoritmo di Manacher] (https://en.wikipedia.org/wiki/Longest_palindromic_substring). – Blastfurnace