Apakah ada algoritma linear-waktu untuk memeriksa bahwa urutan karakter adalah gabungan palindrom? Satu-satunya hal yang terlintas di benak saya adalah solusi naif:
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
Catatan: jawabannya sepele ya jika panjang 1-string didefinisikan sebagai palindrom. Mari kita asumsikan bahwa ini bukan masalahnya.
algorithms
efficiency
strings
saadtaame
sumber
sumber
Jawaban:
Dengan asumsi Anda ingin memisahkan palindrom, ini dikenal sebagai masalah PALSTAR, dan ada algoritma waktu linier oleh Zvi Galil dan Joel Seiferas. Algoritma Pengenalan On-Line Linear-Waktu untuk `` Palstar ' .
Anda dapat menemukan penjelasan algoritma dalam buku di sini: Algoritma Teks (lihat halaman yang ditautkan dan halaman sebelumnya).
Jika Anda baik-baik saja dengan algoritma waktu kuadrat, pemrograman dinamis langsung tampaknya berfungsi.
Diberi strings[1,…n] , kami mempertahankan array yang memberi tahu kami apakah s[1,…j] dapat didekomposisi menjadi palindrom.
Kami juga memelihara tabel 2D yang memberi tahu kami apakahs[i,…j] adalah palindrome atau bukan. Ini dapat kita bangunO(n2) waktu dengan memilih pusat dan memindahkan dua petunjuk ke luar, memeriksa palindrom dengan pusat itu. Lakukan ini untuk setiap pusat yang mungkin:Θ(n) pusat, masing-masing mengambil O(n) waktu.
Sekarang, kamu bisa memeriksanyas[1,…j+1] apakah dapat didekomposisi menjadi palindrom, dengan memeriksa masing-masing 1≤i≤j−1 apakah s[1,…i] dapat diuraikan, dan jika s[i+1,…,j+1] adalah palindrome (menggunakan tabel 2D di atas). Ini menghasilkan aΘ(n2) waktu dan Θ(n2) algoritma ruang.
Penggunaan ruang dapat diturunkan keO(n) , jika Anda menggunakan algoritma on-line Manacher untuk menghitung apakah s[i+1,…j+1] adalah palindrome (as i pergi dari j−1 untuk 1 ), pada dasarnya menyingkirkan tabel 2D.
sumber
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
misalnya, jika
S = banana
, makaS' = 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: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 Sequencessumber
nana
bukan palindrome, saya kira Anda maksudkananana
sebagai gantinya.Misalkan Palindrome [] [] adalah larik dan Palindrom (i, j) adalah fungsi yang memeriksa, apakah substring dari i ke j adalah palindrome dan mengembalikan 1 jika palindrom atau mengembalikan infinity jika bukan palindrom, dan Anda mencari angka terkecil partisi, buat dari bawah ke atas:
Anda harus mengisiO(n2) sel dan masing-masing sel membutuhkan paling banyak O(n) jadi algoritma O(n3) , dengan sedikit modifikasi (preprocessing) Anda dapat memperbaikinya O(n2) , Juga menemukan partisi ini tidak sulit.
sumber
abbaaccaabba.