Si tu veux faire une recherche sur la base avec la distance de Damerau-leveinstein, l'algo présenté par Wikipédia tel quel est très mauvais.
Il faut utiliser un trie et adapter l'algo pour avoir des perfs correctes. Grâce à ce trie tu pourra faire une fonction:
words search(baseword, maxdist)
qui va te renvoyer les id des mots(nom et prenons confondus) dont la distance est inférieure à maxdist, triés de la plus petite à la plus grande distance.
Ensuite tu fais
l1 = search(Nom, maxdist)
l2 = search(Premon, maxdist)
et tu cherches dans l1 et l2 l'id commun tel que la distance soit la plus petite.
Cet algo devrait gérer la plupart des cas.
Si tu veux gérer le cas Dupond B une solution serait d'étendre la distance de Damerau-Leveinstein pour accepter une transformation X****** -> X avec un cout fixe. A tester.