Đưa ra một chuỗi , tôi muốn tìm chuỗi lặp lại dài nhất (ít nhất hai lần). Đó là, tôi muốn tìm một chuỗi w mà là một dãy (không nhất thiết phải là một tiếp giáp) của s mà w = w ' ⋅ w ' . Đó là, w là một chuỗi có một nửa xuất hiện hai lần liên tiếp. Lưu ý rằng w là một chuỗi con của s , nhưng không nhất thiết phải là một chuỗi con.
Ví dụ:
Đối với 'ababccabdc', nó sẽ là 'abcabc', vì 'abc' = 'abc' và 'abc' xuất hiện (ít nhất) hai lần trong 'ababccabdc'.
Đối với 'addbacddabcd', một tùy chọn là 'dddd' vì 'dd' xuất hiện hai lần (tôi không thể sử dụng cùng một chữ cái nhiều lần, nhưng ở đây tôi có 4 'd' nên nó ổn), nhưng nó có thể là một cái tốt hơn 4. Tôi có thể tìm thấy một cái tốt hơn có độ dài 8: 'abcdabcd', vì 'abcd' là một chuỗi con của 'addbacddabcd' xuất hiện hai lần.
Tôi quan tâm đến việc tìm kiếm sự lặp lại dài nhất. Điều này cũng được gọi là "tìm hình vuông dài nhất / lớn nhất", nhưng tôi đã đọc nhiều bài viết trong đó một hình vuông được xác định cho một chuỗi con và không phải là một chuỗi con.
Tôi có thể dễ dàng sử dụng thuật toán brute force sẽ lấy bằng cách lặp trên tất cả các tùy chọn cho một điểm dừng trong chuỗi, và sau đó tôi sẽ có hai chuỗi trong đó tôi sẽ tìm kiếm chuỗi chung lớn nhất / dài nhất, nhưng mỗi kiểm tra sẽ lấy bằng kỹ thuật lập trình động, do đó toàn bộ thời gian sẽ là . Tôi đã tìm thấy một thuật toán hiệu quả hơn cho chuỗi con chung dài nhất mất , vì vậy thời gian chạy sẽ là.
Tôi đang tìm kiếm một thuật toán hiệu quả hơn cho bài toán lặp lại dài nhất. Có lẽ ý tưởng của tôi về việc lặp lại trên tất cả các điểm dừng lãng phí quá nhiều thời gian và có thể được giảm xuống thành các lần lặp ít hơn. Hoặc có lẽ một thuật toán với một thái độ khác nhau có thể giải quyết vấn đề này.
Tôi đã tìm kiếm trong nhiều tạp chí và các câu hỏi trước đó, và hầu hết các kết quả tôi tìm thấy là về một chuỗi con chứ không phải về một chuỗi.
Tôi cũng đã đọc rằng điều này có thể được thực hiện bằng cách sử dụng cây hậu tố, nhưng điều này cũng có liên quan đến các chuỗi con và tôi không chắc liệu ý tưởng đó có thể được mở rộng cho lần sau hay không.
Tôi đang tìm kiếm một giải pháp chạy trong thời gian . Nếu tồn tại một trong thời gian O ( n ⋅ log n ) sẽ còn tốt hơn nữa (tôi không chắc có tồn tại như vậy không).
$
thuật toán thời gian trên đó. Cả hai "nửa" của chuỗi lặp lại dài nhất sẽ nhất thiết phải bắt đầu bằng , do đó, một nửa xuất phát từ mỗi u và v , giải quyết vấn đề LCS.