Katakan bahwa dan adalah dua string dengan panjang yang sama. Sebuah anagramming dari dua string adalah pemetaan bijektif sehingga untuk setiap .b 1 b 2 ... b n p : [ 1 ... n ] → [ 1 ... n ] a i = b p ( i ) i
Mungkin ada lebih dari satu anagram untuk pasangan string yang sama. Misalnya, jika `abcab` dan kami memiliki dan , antara lain.b = p 1 [ 1 , 2 , 3 , 4 , 5 ] → [ 4 , 5 , 1 , 2 , 3 ] p 2 [ 1 , 2 , 3 , 4 , 5 ] → [ 2 , 5 , 1 , 4 , 3 ]cabab
Kita akan mengatakan bahwa bobot dari anagram adalah jumlah potongan yang harus dibuat dalam string pertama untuk mendapatkan potongan yang dapat disusun ulang untuk mendapatkan string kedua. Secara formal, ini jumlah nilai yang . Artinya, itu adalah jumlah titik di mana tidak tidak meningkat persis 1.Untuk contoh, dan , karena pemotongan sekali, ke dalam potongan dan , dan pemotongan empat kali, menjadi lima bongkahan.p i ∈ [ 1 … n - 1 ] p ( i ) + 1 ≠ p ( i + 1 ) pw ( p 2 ) = 4 p 1 p 212345
123
45
12345
Misalkan ada anagram untuk dua string dan . Maka setidaknya satu anagram harus memiliki bobot paling sedikit. Katakanlah ini yang paling ringan . (Mungkin ada beberapa anagram yang paling ringan; saya tidak peduli karena saya hanya tertarik pada bobotnya.)b
Pertanyaan
Saya menginginkan algoritma yang, mengingat dua string yang ada anagram, efisien menghasilkan berat yang tepat dari anagram yang paling ringan dari dua string. Tidak apa-apa jika algoritme juga menghasilkan anagram paling ringan, tetapi tidak perlu.
Ini adalah masalah yang cukup sederhana untuk menghasilkan semua anagram dan menimbangnya, tetapi mungkin ada banyak, jadi saya lebih suka metode yang menemukan anagram cahaya secara langsung.
Motivasi
Alasan masalah ini menarik adalah sebagai berikut. Sangat mudah untuk membuat komputer mencari kamus dan menemukan anagram, pasangan kata yang berisi huruf yang persis sama. Tetapi banyak dari anagram yang dihasilkan tidak menarik. Misalnya, contoh terpanjang yang dapat ditemukan dalam Kamus Internasional Kedua Webster adalah:
cholecystoduodenostomy
duodenocholecystostomy
Masalahnya harus jelas: ini tidak menarik karena mereka mengakui anagramming sangat ringan yang hanya pertukaran tersebut cholecysto
, duedeno
dan stomy
bagian, untuk berat 2. Di sisi lain, contoh yang lebih pendek ini jauh lebih mengejutkan dan menarik:
penampang garis pantai
Di sini anagram yang paling ringan memiliki bobot 8.
Saya memiliki program yang menggunakan metode ini untuk menemukan anagram yang menarik, yaitu yang memiliki semua anagram berat. Tetapi ia melakukan ini dengan menghasilkan dan menimbang semua kemungkinan anagram, yang lambat.
cholecystoduodenostomy
is ccddeehlmnooooossttuyy
.) Dua kata adalah anagram jika dan hanya jika mereka memiliki bentuk kanonik yang sama. Anda menyimpan kata-kata dalam tabel hash, dikunci oleh bentuk kanonik mereka, dan setiap kali Anda menemukan tabrakan, Anda memiliki anagram.