Diberikan string , saya ingin mencari pengulangan terpanjang (setidaknya dua kali). Yaitu, saya ingin mencari string yang merupakan urutan (tidak harus bersebelahan) dari sehingga . Artinya, adalah string yang bagiannya muncul dua kali berturut-turut. Perhatikan bahwa adalah lanjutan dari , tetapi tidak harus berupa substring.w s w = w ′ ⋅ w ′ w w s
Contoh:
Untuk 'ababccabdc' akan menjadi 'abcabc', karena 'abc' = 'abc' dan 'abc' muncul (setidaknya) dua kali dalam 'ababccabdc'.
Untuk 'addbacddabcd' satu opsi adalah 'dddd' karena 'dd' muncul dua kali (saya tidak dapat menggunakan huruf yang sama beberapa kali, tapi di sini saya punya 4 'd begitu ok), tetapi dengan lebngth 4. Saya dapat menemukan yang lebih baik dengan panjang 8: 'abcdabcd', karena 'abcd' adalah substring dari 'addbacddabcd' yang muncul dua kali.
Saya tertarik untuk menemukan urutan berulang terlama. Ini juga disebut "menemukan kuadrat terpanjang / terbesar", tetapi saya telah membaca banyak artikel di mana kuadrat didefinisikan untuk substring dan bukan untuk urutan berikutnya.
Saya dapat dengan mudah menggunakan algoritma brute force yang akan mengambil dengan mengulangi semua opsi untuk breakpoint dalam string, dan kemudian saya akan memiliki dua string di mana saya akan mencari urutan umum terbesar / terpanjang, tetapi setiap cek akan mengambil menggunakan teknik pemrograman dinamis, sehingga seluruh waktu akan menjadi . Saya menemukan algoritma yang lebih efisien untuk urutan umum terpanjang yang mengambil , sehingga waktu berjalan akan menjadi .O ( n 2 ) O ( n 3 ) O ( n 2O(n3
Saya mencari algoritma yang lebih efisien untuk masalah pengulangan terpanjang. Mungkin ide saya tentang iterasi pada semua breakpoint menghabiskan banyak waktu, dan dapat dikurangi menjadi iterasi yang lebih sedikit. Atau mungkin suatu algoritma dengan sikap yang berbeda dapat menyelesaikan masalah ini.
Saya telah mencari di banyak jurnal dan pertanyaan sebelumnya, dan sebagian besar hasil yang saya temukan adalah tentang substring dan bukan tentang berikutnya.
Saya juga membaca bahwa ini dapat dilakukan dengan menggunakan pohon suffix, tetapi ini juga relevan dengan substring dan saya tidak yakin apakah ide seperti itu dapat diperpanjang untuk selanjutnya.
Saya mencari solusi yang berjalan dalam waktu . Jika ada satu dalam waktu yang akan lebih baik (saya tidak yakin apakah ada).O ( n ⋅ log n )
$
Jawaban:
Berikut ini adalah solusi pemrograman dinamis.
Misalkan string input adalah . Buat tabel yang baris dan kolomnya diindeks oleh (dengan adalah panjang dari string), diisi oleh aturan Jawabannya adalah .x1…xn T 0,…,n n
sumber
if
dp[i][j] = dp[i - 1][j - 1] + 1