Để xây dựng trên VenomFangs trả lời, có một giải pháp quy hoạch động đơn giản với trang này. Lưu ý rằng tôi giả định rằng hoạt động duy nhất được phép ở đây là chèn các ký tự (không xóa, cập nhật). Gọi S là một chuỗi ký tự n. Các đơn giản chức năng đệ quy P cho điều này là:
= P [i+1 .. j-1], if S[i] = S[j]
P [i..j]
= min (P[i..j-1], P[i+1..j]) + 1,
Nếu bạn muốn giải thích thêm về lý do tại sao điều này là đúng, viết bình luận và tôi muốn vui lòng giải thích (mặc dù nó khá dễ dàng để xem với một chút suy nghĩ). Điều này, bằng cách này, là hoàn toàn trái ngược với chức năng LCS bạn sử dụng, do đó xác nhận rằng giải pháp của bạn là trong thực tế tối ưu. Tất nhiên nó hoàn toàn có thể tôi đã vung, nếu có, ai đó cho tôi biết!
Edit: Để giải thích cho các palindrome bản thân, điều này có thể dễ dàng thực hiện như sau: Như đã trình bày ở trên, P [1..n] sẽ cung cấp cho bạn số lượng chèn cần thiết để thực hiện chuỗi này một palindrome. Khi mảng hai chiều ở trên được tạo, đây là cách bạn tìm thấy palindrome:
Bắt đầu với i = 1, j = n. Bây giờ, đầu ra chuỗi = "";
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
Điều đó có giúp đọc tốt hơn không?
Cảm ơn bạn @kyun. Nhưng tôi đã thành công trong việc phát hiện ra số lần chèn. Tôi đã xác định rằng tôi cần phải tìm chuỗi palindrome được hình thành sau khi chèn? Bạn có thể cho tôi một giải pháp tối ưu không? Cảm ơn bạn trước. – whitepearl
Đã chỉnh sửa ngay bây giờ, điều đó có hữu ích không? – kyun