Deux chaînes de longueur k , différant par un caractère, partagent un préfixe de longueur l et un suffixe de longueur m tels que k = l + m + 1 .
La réponse de Simon Prins l'encode en stockant explicitement toutes les combinaisons préfixe / suffixe, c'est-à-dire abc
devient *bc
, a*c
et ab*
. C'est k = 3, l = 0,1,2 et m = 2,1,0.
Comme le souligne valarMorghulis, vous pouvez organiser les mots dans une arborescence de préfixes. Il y a aussi l'arbre des suffixes très similaire. Il est assez facile d'augmenter l'arborescence avec le nombre de nœuds feuilles sous chaque préfixe ou suffixe; cela peut être mis à jour dans O (k) lors de l'insertion d'un nouveau mot.
La raison pour laquelle vous souhaitez que ces nombres de frères et sœurs soit que vous sachiez, étant donné un nouveau mot, si vous voulez énumérer toutes les chaînes avec le même préfixe ou si vous devez énumérer toutes les chaînes avec le même suffixe. Par exemple, pour "abc" en entrée, les préfixes possibles sont "", "a" et "ab", tandis que les suffixes correspondants sont "bc", "c" et "". Comme il est évident, pour les suffixes courts, il est préférable d'énumérer les frères et sœurs dans l'arborescence des préfixes et vice versa.
Comme le souligne @einpoklum, il est certainement possible que toutes les chaînes partagent le même préfixe k / 2 . Ce n'est pas un problème pour cette approche; l'arbre de préfixe sera linéaire jusqu'à la profondeur k / 2, chaque nœud jusqu'à la profondeur k / 2 étant l'ancêtre de 100 000 nœuds foliaires. Par conséquent, l'arborescence des suffixes sera utilisée jusqu'à la profondeur (k / 2-1), ce qui est bien car les chaînes doivent différer dans leurs suffixes étant donné qu'elles partagent des préfixes.
[edit] Comme optimisation, une fois que vous avez déterminé le préfixe unique le plus court d'une chaîne, vous savez que s'il y a un caractère différent, ce doit être le dernier caractère du préfixe, et vous auriez trouvé le quasi-doublon quand vérifier un préfixe plus court. Donc, si "abcde" a le préfixe unique le plus court "abc", cela signifie qu'il existe d'autres chaînes commençant par "ab?" mais pas avec "abc". C'est-à-dire que s'ils différaient en un seul caractère, ce serait ce troisième caractère. Vous n'avez plus besoin de vérifier "abc? E".
Par la même logique, si vous trouvez que "cde" est un suffixe unique le plus court, alors vous savez que vous devez vérifier uniquement le préfixe "ab" de longueur 2 et non les préfixes de longueur 1 ou 3.
Note that this method works only for exactly one character differences and does not generalize to 2 character differences, it relies one one character being the separation between identical prefixes and identical suffixes.