Nếu cho phép chồng lấp, nó có thể được thực hiện trong thời gian tuyến tính (theo kích thước của chuỗi đầu vào).
Một số định nghĩa
Hãy xác định khái niệm về palindrom tối đa :
Một palindrom tối đa bán kính k của một chuỗi S là một chuỗi con S 'sao cho
- bắt đầu từ trung tâm, S 'đọc cùng một ký tự k theo cả hai hướng
- nhưng không cho ký tự k + 1
- k> 1 (vì vậy một ký tự không phải là một bảng màu)
ví dụ: if S = banana
, thì S' = anana
là một palindrom tối đa của bán kính 2.
Một palindrom tối đa là một palindrom tối đa bán kính k cho một số k.
Ví dụ, nếu S = banana
, "ana"
, "anana"
, tất cả đều palindromes tối đa của nó.
Sử dụng palindromes tối đa
Bây giờ, nếu chúng ta có thể định vị tất cả các palindrome tối đa của một chuỗi , sẽ rất đơn giản để kiểm tra xem toàn bộ chuỗi có phải là một chuỗi của palindromes hay không.
Đi S = abbaccazayaz
. Palindromes tối đa của nó là:
- abba, chính giữa vị trí 2 và 3, bán kính = 2
- acca, chính giữa vị trí 5 và 6, bán kính = 2
- zayaz, tập trung ở vị trí 10, bán kính = 2
vì vậy "abba" trải dài trên [1..4], "acca" kéo dài qua [4..7], "zayaz" kéo dài qua [8..12]. Vì sự kết hợp của ba palindromes này (cho phép chồng chéo?) Trải dài trên toàn bộ chuỗi, theo sau đó "abbaccazayaz" là nối của palindromes.
Tính toán palindromes tối đa trong thời gian tuyến tính
Bây giờ, hóa ra chúng ta có thể định vị tất cả các palindrome tối đa của một chuỗi S trong thời gian tuyến tính !*
Ý tưởng là sử dụng cây hậu tố cho S được trang bị các truy vấn tổ tiên chung thấp nhất thời gian không đổi .
Vì vậy, chúng ta có thể kiểm tra xem một chuỗi S có độ dài m có phải là một chuỗi các palindromes trong thời gian O (n) không.
*
Gusfield, Dan (1997), "9.2 Tìm tất cả các palindromes tối đa trong thời gian tuyến tính", Thuật toán trên Chuỗi, Cây và Chuỗi