Cho một xâu (giả chỉ ký tự tiếng Anh) S
chiều dài n
, chúng ta có thể đếm số lượng các chuỗi con xuôi ngược với các thuật toán sau đây:Đếm chuỗi con xuôi ngược trong thời gian O (n)
for i = 0 to |S| do
p1 = number of palindromes centered in i (odd length)
p2 = number of palindromes centered in i and i+1 (even length)
add p1 + p2 to total number of palindromic substrings of S
Đoạn mã trên là O(n^2)
Tuy nhiên.
Tôi quan tâm đến thuật toán giải quyết vấn đề này trong O(n)
. Tôi biết chắc chắn rằng một trong những tồn tại như tôi đã nghe nhiều người nói rằng nó, và vấn đề tồn tại trên một trang web trực tuyến thẩm phán địa phương với một ràng buộc trên của 1 000 000
trên n
, tuy nhiên tôi chưa bao giờ nhìn thấy các thuật toán và không thể dường như có thể tìm ra nó.
Cập nhật:
Ý tưởng chung tôi có là để tính toán len[i] = length of the longest palindrome centered at the character 2i + 1
và một mảng tương tự cho palindromes thậm chí dài. Với sổ sách kế toán tốt, nó có thể tính toán điều này trong O(1)
cho mỗi nhân vật, mà sẽ cho phép chúng ta đếm rất nhiều palindromes cùng một lúc. Tôi đang mắc kẹt về cách chính xác để tính toán này tuy nhiên.
Tôi sẽ chấp nhận giải pháp sử dụng O(n)
và thậm chí có thể là O(n log n)
bộ nhớ bổ sung. Tôi nghĩ điều này là không thể nếu không có nó.
Bất kỳ ý tưởng hay tham chiếu hay nào đều được đánh giá cao.
Điều gì khiến bạn nghĩ giải pháp là thời gian O (n)? Ngoài ra, nó khá kỳ lạ khi có một thuật toán thời gian O (n) yêu cầu không gian O (n log n). –
@Strilanc - Tôi nghĩ rằng đó là O (n) bởi vì đó là sự phức tạp được đề cập bởi một số người và điều duy nhất có thể chạy trong 0,1 giây trên một triệu ký tự. – IVlad
Liên quan: [Viết hàm trả về palindrome dài nhất trong một chuỗi đã cho] (http://stackoverflow.com/q/1115001/54262) –