Pertama-tama kita harus membaca sebuah kata, dan ukuran yang diinginkan.
Maka kita perlu menemukan palindrom terpanjang yang dibuat oleh karakter dalam kata ini yang digunakan secara berurutan.
Misalnya untuk ukuran = 7 dan kata = "abcababac" jawabannya adalah 7 ("abababa").
Catatan tambahan: ukuran kata lebih kecil dari 3000.
algorithms
strings
subsequences
Gilles 'SANGAT berhenti menjadi jahat'
sumber
sumber
Jawaban:
Ada algoritma yang dinamai berdasarkan algoritma Manacher, yang sangat cepat, algoritma waktu linier.
Lihat referensi Wikipedia
Catatan tambahan: Jika Anda benar-benar terbiasa dengan Algoritma Z , Anda akan menemukan bahwa mereka mirip.
Edit
Saya baru saja salah mengerti arti OP (tapi saya tidak ingin menghapus informasi yang diproses. Ini agak berguna). Maksudnya adalah palindrom terpanjang dari sebuah string, sehingga pemrograman dinamis tampak bagus: mana menunjukkan panjang palindrome terpanjang dari , dan adalah kurung Iverson. Saya pikir itu seperti LCS .
sumber
Algoritma tercepat yang dapat saya pikirkan adalah menerapkan LCS dengan cara yang kreatif. Ini dapat menyelesaikan masalah ini dalam waktu O (N ^ 2) dan ruang O (N ^ 2) di mana N adalah ukuran string.
LCS (S, reverse (S)) akan memberi Anda urutan palindromik terbesar, karena urutan palindromik terbesar adalah urutan umum terbesar antara string S dan kebalikannya.
Misalnya,
S = "abcababac"
T = "cababacba" (kebalikan dari S)
LCS (S, T) = "abababa"
sumber
Masalah menemukan LPS dari sebuah string dapat dikonversi menjadi menemukan Sub-urutan Umum Terpanjang dari dua string. Dalam hal ini, satu string akan menjadi yang asli dan yang kedua akan menjadi terbalik dari string yang asli.
Masalah Pemanjangan Umum Terpanjang adalah seperti masalah pencocokan pola, kecuali bahwa Anda diizinkan untuk melewati karakter dalam teks. Juga, tujuannya adalah untuk mengembalikan hanya satu pertandingan, yang selama mungkin.
LCS dapat dipecahkan dalam menggunakan Rekursi dan Memoisasi.O(n2)
Ada algoritma yang sedikit lebih cepat ditemukan oleh Masek dan Paterson dari kompleksitas waktu . Tautan kertas: Masek dan PatersonO(n2/lgn)
Dua algoritma lain disajikan oleh Hirschberg untuk menghitung LCS dari dua string (ukuran ) dan (ukuran ). Berdasarkan asumsi bahwa simbol-simbol yang mungkin muncul dalam string ini berasal dari beberapa alfabet ukuran (yang sebenarnya berlaku di sebagian besar kasus). Jadi simbol dapat disimpan dalam memori menggunakan bit, yang akan muat dalam satu kata memori. dua simbol dapat dibandingkan dalam waktu. Jumlah berbeda dalam string dilambangkan dengan , yang tentu saja kurang dari dan .A n B m t log(t) O(1) B s m t
Yang ini membutuhkan waktu di mana adalah panjang LCS. Ini digunakan ketika panjang LCS diharapkan menjadi kecil. Ketika kita memecahkan masalah ini dengan menggunakan Pemrograman Dinamis maka kita menemukan bahwa sebagian besar entri dalam matriks adalah sama, sehingga kita dapat menggunakan gagasan Pemrograman Dinamis Jarang.O(pn+nlgn) p
Algoritma ini membutuhkan waktu . Ini sangat efisien ketika panjang LCS mendekati , dalam hal ini akan dekat dengan .O(p(m+1−p)logn) m O(nlgn)
Prosedur dan algoritma terperinci dijelaskan dalam makalah Hirschberg .
Algoritma lain yang baik diusulkan oleh Sohel Rahman yang berjalan dalam waktu , di mana adalah jumlah total pasangan posisi yang dipesan untuk string strings. Ini tidak berlaku ketika adalah urutan , tetapi ada banyak kasus ketika adalah urutan . Yang ini menggunakan konsep RMQ (Range Maximum Query). Tautan kertas: RahmanO(Rloglogn) R R O(n2) R n
sumber
Saya mungkin melewatkan sesuatu, karena sepertinya agak sepele bagi saya: Cobalah untuk memasangkan setiap karakter dengan karakter yang sama. Kemudian letakkan karakter pertama dari setiap pasangan di sisi kiri, karakter lain di sisi kanan, dan jika ada karakter yang tersisa (yaitu, karakter tidak dipasangkan dengan yang lain), lalu pilih salah satu dari mereka dan letakkan yang di dalam tengah.
sumber