Powiedzieć, że 1 2 ... n i są dwa ciągi o tej samej długości. Anagramming dwóch ciągów bijective mapowania tak, że dla każdego .
Może być więcej niż jedno anagramowanie dla tej samej pary ciągów. Na przykład, jeśli `abcab` mamy i , między innymi.cabab
Powiemy, że waga anagramowania jest liczbą cięć, które należy wykonać w pierwszym ciągu, aby uzyskać kawałki, które można zmienić, aby uzyskać drugi ciąg. Formalnie jest to liczba wartości dla których . Oznacza to, że jest to liczba punktów, w których jest nie zwiększają dokładnie 1. Dla przykładu, i , ponieważ cięcia raz, do fragmentów i i cięcia czterech razy, na pięć części.12345
123
45
12345
Załóżmy, że istnieje anagramowanie dla dwóch ciągów i . W takim razie co najmniej jedno anagramowanie musi mieć najmniejszą wagę. Powiedzmy, że ten jest najlżejszy . (Może być wiele najlżejszych anagramów; nie obchodzi mnie to, ponieważ interesują mnie tylko ciężary.)
Pytanie
Chcę algorytmu, który, biorąc pod uwagę dwa ciągi, dla których istnieje anagramowanie, wydajnie daje dokładną wagę najlżejszego anagramowania dwóch ciągów. W porządku, jeśli algorytm daje najlżejsze anagramowanie, ale nie musi.
Generowanie wszystkich anagramowań i ich ważenie jest dość prostą sprawą, ale może być ich wiele, więc wolałbym metodę, która bezpośrednio wyszukuje anagramy.
Motywacja
Powód, dla którego ten problem jest interesujący, jest następujący. Bardzo łatwo jest zmusić komputer do przeszukiwania słownika i znajdowania anagramów, par słów zawierających dokładnie te same litery. Ale wiele wyprodukowanych anagramów jest nieciekawych. Na przykład najdłuższe przykłady, które można znaleźć w drugim międzynarodowym słowniku Webstera, to:
cholecystoduodenostomy
duodenocholecystostomy
Problem powinien być jasne: są nieciekawe, ponieważ przyznać bardzo lekki anagramming które po prostu zamienia cholecysto
, duedeno
i stomy
sekcje, na wadze 2. Z drugiej strony, to znacznie krótszy przykładem jest znacznie bardziej zaskakujące i interesujące:
linia brzegowa
przekroju
Tutaj najlżejsze anagramowanie ma wagę 8.
Mam program, który używa tej metody do znajdowania interesujących anagramów, a mianowicie tych, dla których wszystkie anagramy mają dużą wagę. Ale robi to, generując i ważąc wszystkie możliwe anagramy, co jest powolne.
cholecystoduodenostomy
to ccddeehlmnooooossttuyy
.) Dwa słowa są anagramami, jeśli tylko wtedy, gdy mają taką samą kanoniczną formę. Przechowujesz słowa w tablicy skrótów, wpisując ich kanoniczne formy, a gdy znajdziesz kolizję, masz anagram.