OK! Đây là nỗ lực thứ hai của tôi.
Ý tưởng là chúng tôi muốn tìm xem có bao nhiêu ký tự ở cuối chuỗi có thể được sử dụng lại khi thêm các ký tự thừa để hoàn thành palindrome. Để thực hiện điều này, chúng tôi sẽ sử dụng một sửa đổi của thuật toán kết hợp chuỗi KMP. Sử dụng KMP, chúng tôi tìm kiếm chuỗi gốc để đảo ngược. Khi chúng ta đến cuối của chuỗi, chúng ta sẽ có nhiều kết hợp nhất có thể giữa chuỗi đảo ngược và chuỗi gốc xuất hiện ở cuối chuỗi. Ví dụ:
HELLO
O
1010
010
3202
202
1001
1001
Tại thời điểm này, KMP thường nói "không khớp" trừ khi chuỗi gốc là palindrome. Tuy nhiên, vì chúng tôi hiện biết số lượng của chuỗi đảo ngược được so khớp, chúng tôi có thể tìm ra số lượng ký tự còn thiếu và sau đó gắn chúng vào cuối chuỗi. Trong trường hợp đầu tiên, chúng tôi đang thiếu LLEH
. Trong trường hợp thứ hai, chúng tôi thiếu 1
. Trong lần thứ ba, chúng tôi đang thiếu 3
. Trong trường hợp cuối cùng, chúng ta không bỏ sót bất cứ điều gì, vì chuỗi ban đầu là một palindrome.
Thời gian chạy của thuật toán này là thời gian chạy của tìm kiếm KMP chuẩn cộng với thời gian cần thiết để đảo ngược chuỗi: O (n) + O (n) = O (n).
Vì vậy, bây giờ để tranh luận tính chính xác. Điều này sẽ đòi hỏi một số nỗ lực. Xem xét câu trả lời tối ưu:
| original string | | extra characters |
Giả sử chúng ta đọc ngược từ cuối, có nghĩa là chúng ta sẽ đọc ít nhất ngược lại của chuỗi gốc. Một phần của chuỗi đảo ngược này mở rộng ngược vào phần thân của chuỗi gốc. Trong thực tế, để giảm thiểu số lượng ký tự được thêm vào, đây phải là số ký tự lớn nhất có thể kết thúc lại vào chính chuỗi đó. Chúng ta có thể thấy điều này tại đây:
| original string | | extra characters |
| overlap |
Bây giờ, điều gì xảy ra trong bước KMP của chúng tôi? Vâng, khi tìm kiếm đảo ngược của chuỗi bên trong chính nó, KMP sẽ giữ càng lâu của một trận đấu càng tốt ở tất cả các lần như nó hoạt động trên chuỗi. Điều này có nghĩa là khi KMP chạm vào cuối chuỗi, phần khớp mà nó duy trì sẽ là kết quả dài nhất có thể, vì KMP chỉ di chuyển điểm bắt đầu của kết quả ứng cử viên về phía trước trên một lỗi. Do đó, chúng tôi có chồng chéo dài nhất có thể, vì vậy chúng tôi sẽ nhận được số ký tự ngắn nhất có thể được yêu cầu ở cuối.
Tôi không chắc chắn 100% tính năng này hoạt động, nhưng có vẻ như nó hoạt động trong mọi trường hợp tôi có thể ném vào nó. Bằng chứng chính xác có vẻ hợp lý, nhưng nó hơi lộn xộn một chút bởi vì bằng chứng dựa trên KMP chính thức có lẽ sẽ hơi phức tạp một chút.
Hy vọng điều này sẽ hữu ích!
cách dễ nhất chỉ là 'str + str.reverse()'. nhưng tôi nghi ngờ đó là min –
Và hướng dẫn xung đột: bất cứ nơi nào trong từ! = nối thêm chỉ –
@RobotWoods .. cho phép nói rằng chúng tôi chỉ có thể nối thêm chúng .. bất kỳ ý tưởng nào bây giờ ?? –