Jika tumpang tindih diperbolehkan, itu bisa dilakukan dalam waktu linier (dalam ukuran string input).
Beberapa definisi
Mari kita mendefinisikan konsep palindrome maksimal :
Sebuah palindrom maksimal radius k dari string S adalah substring S' seperti yang
- mulai dari tengah, S 'membaca karakter k yang sama di kedua arah
- tetapi tidak untuk k + 1 karakter
- k> 1 (jadi satu karakter bukan palindrome)
misalnya, jika S = banana
, maka S' = anana
adalah palindrome maksimal jari-jari 2.
Sebuah palindrom maksimal adalah palindrom maksimal radius k untuk beberapa k.
Sebagai contoh, jika S = banana
, "ana"
, "anana"
, semua palindrom maksimal nya.
Menggunakan palindrom maksimal
Sekarang, jika kita dapat menemukan semua palindrom maksimal string , akan mudah untuk memeriksa apakah seluruh string adalah gabungan palindrom.
Ambil S = abbaccazayaz
. Palindrom maksimalnya adalah:
- abba, berpusat di antara posisi 2 dan 3, jari-jari = 2
- ACCA, berpusat di antara posisi 5 dan 6, jari-jari = 2
- zayaz, berpusat di posisi 10, jari-jari = 2
jadi "abba" membentang [1..4], "acca" membentang [4..7], "zayaz" membentang [8..12]. Karena rangkaian ketiga palindrom ini (tumpang tindih diizinkan?) Mencakup seluruh string, maka "abbaccazayaz" adalah gabungan palindrom.
Menghitung palindrom maksimal dalam waktu linier
Sekarang, ternyata kita dapat menemukan semua palindrom maksimal dari string S dalam waktu linier !*
Idenya adalah untuk menggunakan pohon sufiks untuk S yang dilengkapi dengan permintaan leluhur umum terendah yang konstan dan waktu .
Jadi kita dapat memeriksa apakah string S dengan panjang m adalah gabungan palindrom dalam waktu O (n).
*
Gusfield, Dan (1997), "9.2 Menemukan semua palindrom maksimal dalam waktu linier", Algoritma pada Strings, Trees, and Sequences