Aby rozwinąć VenomFangs odpowiedzieć, jest proste rozwiązanie dynamicznego programowania do tego. Zauważ, że zakładam, że jedyną operacją dozwoloną tutaj jest wstawianie znaków (bez usuwania, aktualizacji). Niech S będzie ciągiem znaków n. Prosta funkcja rekursji P na to:
= P [i+1 .. j-1], if S[i] = S[j]
P [i..j]
= min (P[i..j-1], P[i+1..j]) + 1,
Jeśli chcesz więcej wyjaśnień, dlaczego to prawda, skomentować i ja bądź szczęśliwy, aby wyjaśnić (choć jest to dość łatwe do zrozumienia przy odrobinie myśli). To, nawiasem mówiąc, jest dokładnym przeciwieństwem funkcji LCS, której używasz, potwierdzając tym samym, że twoje rozwiązanie jest w rzeczywistości optymalne. Oczywiście, że jest to całkowicie możliwe, spartaczyłem, jeśli tak, to ktoś mi dał znać!
Edit: W celu uwzględnienia samego palindrom, można to łatwo zrobić w następujący sposób: Jak stwierdzono powyżej, P [1..n] nie daje liczbę wstawek wymagane, aby ten ciąg palindrom. Po zbudowaniu powyższej dwuwymiarowej tablicy, oto jak znaleźć palindrom:
Zacznij za pomocą i = 1, j = n. Teraz, ciąg znaków = "";
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
Czy to sprawia, że lepsze czytanie?
Dziękuję @kyun. Ale udało mi się znaleźć liczbę wstawek do wykonania. Podkreśliłem, że muszę znaleźć ciąg palindromu utworzony po wstawieniu? Czy możesz dać mi optymalne rozwiązanie? Z góry dziękuję. – whitepearl
Edytowane teraz, czy to pomaga? – kyun