Um näher auf VenomFangs beantworten, ist es eine einfache dynamische Programmierlösung zu diesem. Beachten Sie, dass ich annahm, dass hier nur Zeichen eingefügt werden dürfen (keine Löschung, Updates). Sei S eine Folge von n Zeichen. Die einfache Rekursion Funktion P hierfür ist:
= P [i+1 .. j-1], if S[i] = S[j]
P [i..j]
= min (P[i..j-1], P[i+1..j]) + 1,
Wenn Sie mehr Erklärung möchten, warum dies wahr ist, schreiben Sie einen Kommentar und ich würde sei froh zu erklären (obwohl es mit ein wenig Nachdenken ziemlich leicht zu sehen ist). Dies ist übrigens das genaue Gegenteil der von Ihnen verwendeten LCS-Funktion und bestätigt somit, dass Ihre Lösung tatsächlich optimal ist. Natürlich ist es völlig möglich, dass ich mich verpfuscht habe, wenn ja, jemand lässt es mich wissen!
Edit: Um sich für das Palindrom-Konto selbst, kann dies leicht geschehen wie folgt: Wie oben erwähnt, P [1..n] würde Ihnen die Anzahl von Einfügungen erforderlich, um diese Zeichenfolge ein Palindrom zu machen. Sobald das obige zweidimensionale Array aufgebaut ist, folgt das Palindrom:
Beginnen Sie mit i = 1, j = n. Jetzt, 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
Macht das besseres Lesen?
Danke @kyun. Aber ich habe die Anzahl der einzuführenden Insertionen herausgefunden. Ich habe angegeben, dass ich die Palindrom-Saite nach dem Einfügen finden muss? Kannst du mir eine optimale Lösung geben? Danke im Voraus. – whitepearl
Bearbeitet jetzt, hilft das? – kyun