Supposons que et b 1 b 2 … b n sont deux chaînes de même longueur. Une anagrammation de deux chaînes est une cartographie bijective p : [ 1 … n ] → [ 1 … n ] telle que a i = b p ( i ) pour chaque i .
Il peut y avoir plusieurs anagrammes pour la même paire de chaînes. Par exemple, si `abcab` et b = nous avons p 1 [ 1 , 2 , 3 , 4 , 5 ] → [ 4 , 5 , 1 , 2 , 3 ] et p 2 [ 1 , 2 , 3 , 4 , 5 ] → [ 2 , 5 , 1cabab
, entre autres.
Nous dirons que le poids d'une anagramme p est le nombre de coupes que l'on doit faire dans la première chaîne pour obtenir des morceaux qui peuvent être réarrangés pour obtenir la deuxième chaîne. Formellement, c'est le nombre de valeurs de i ∈ [ 1 … n - 1 ] pour lesquelles p ( i ) + 1 ≠ p ( i + 1 ) . C'est-à-dire que c'est le nombre de points où p n'augmente pas exactement de 1. Par exemple, w ( p et w ( p 2 ) = 4 , car p 1 coupeune fois, en morceauxet, et p 2 coupequatre fois, en cinq morceaux.12345
123
45
12345
Supposons qu'il existe une anagramme pour deux chaînes et b . Ensuite, au moins une anagramme doit avoir le moins de poids. Disons que celui-ci est le plus léger . (Il peut y avoir plusieurs anagrammes les plus légers; je m'en fiche parce que je ne m'intéresse qu'aux poids.)
Question
Je veux un algorithme qui, étant donné deux chaînes pour lesquelles une anagramme existe, donne efficacement le poids exact de l'anagramme le plus léger des deux chaînes. Ce n'est pas grave si l'algorithme donne également une anagramme la plus légère, mais ce n'est pas nécessaire.
C'est assez simple de générer tous les anagrammes et de les peser, mais il peut y en avoir beaucoup, donc je préférerais une méthode qui trouve directement les anagrammes légers.
Motivation
La raison pour laquelle ce problème est intéressant est la suivante. Il est très facile de faire rechercher dans le dictionnaire l'ordinateur et de trouver des anagrammes, des paires de mots qui contiennent exactement les mêmes lettres. Mais beaucoup d'anagrammes produites sont sans intérêt. Par exemple, les exemples les plus longs que l'on trouve dans le deuxième dictionnaire international de Webster sont:
cholécystoduodénostomie
duodénocholécystostomie
Le problème devrait être clair: ce sont sans intérêt car ils admettent un anagramming très léger que le simple échange de la cholecysto
, duedeno
et les stomy
sections, pour un poids de 2. D'autre part, cet exemple beaucoup plus court est beaucoup plus surprenant et intéressant:
sectionnel littoral
Ici, l'anagramme le plus léger a un poids de 8.
J'ai un programme qui utilise cette méthode pour localiser des anagrammes intéressantes, à savoir celles pour lesquelles toutes les anagrammes sont de poids élevé. Mais il le fait en générant et en pesant tous les anagrammes possibles, ce qui est lent.
cholecystoduodenostomy
est ccddeehlmnooooossttuyy
.) Deux mots sont des anagrammes si et seulement s'ils ont la même forme canonique. Vous stockez les mots dans une table de hachage, saisis par leurs formes canoniques, et chaque fois que vous trouvez une collision, vous avez une anagramme.