di approfondire VenomFangs rispondere, c'è una soluzione semplice programmazione dinamica a questo. Si noti che sto assumendo che l'unica operazione consentita qui sia l'inserimento di caratteri (nessuna eliminazione, aggiornamenti). Sia S una stringa di n caratteri. La semplice funzione ricorsione P per questo è:
= P [i+1 .. j-1], if S[i] = S[j]
P [i..j]
= min (P[i..j-1], P[i+1..j]) + 1,
Se vuoi maggiori spiegazioni sul motivo per cui questo è vero, inviare un commento e mi piacerebbe essere felice di spiegare (anche se è piuttosto facile da vedere con un pensierino). Questo, a proposito, è l'esatto opposto della funzione LCS che usi, quindi convalida che la tua soluzione sia effettivamente ottimale. Certo che è del tutto possibile, ho commesso un pasticcio, se così fosse, qualcuno me lo faccia sapere!
Modifica: Per spiegare il palindromo stesso, questo può essere fatto facilmente come segue: Come detto sopra, P [1..n] darebbe il numero di inserzioni necessari per rendere questa stringa un palindromo. Una volta creato l'array bidimensionale sopra, ecco come si trova il palindrome:
Inizia con i = 1, j = n. Ora, string output = "";
while(i < j)
{
if (P[i][j] == P[i+1][j-1]) //this happens if no insertions were made at this point
{
output = output + S[i];
i++;
j--;
}
else
if (P[i][j] == P[i+1][j]) //
{
output = output + S[i];
i++;
}
else
{
output = S[j] + output;
j--;
}
}
cout<<output<<reverse(output);
//You may have to be careful about odd sized palindromes here,
// I haven't accounted for that, it just needs one simple check
Questo rende la lettura migliore?
Grazie @kyun. Ma ho trovato con successo il numero di inserimenti da effettuare. Ho specificato che ho bisogno di trovare la stringa palindromica formata dopo gli inserimenti? Puoi darmi una soluzione ottimale? Ringraziandola in anticipo. – whitepearl
Modificato ora, ti aiuta? – kyun