Il semble que ce que vous voulez vraiment, c'est quelque chose comme la distance de Levenshtein (mais pas exactement cela). Voici une première coupe.
Ce qu'il fait est de marcher l'arbre de jeu de tous les réarrangements possibles de un pour voir si elles correspondent b. Il associe un coût à chaque réarrangement, exprimé par un budget en baisse.
La boucle externe marche d'abord avec un budget de 0, donc seule une correspondance exacte est autorisée.
S'il n'a pas eu de succès, alors il marche avec un budget de 1, trouvant toutes les correspondances contenant un seul réarrangement.
S'il n'a pas eu de succès, alors il marche avec un budget de 2, et ainsi de suite.
Comme il correspond, il conserve un tableau d'entiers delta, dire à quel point chaque élément de un a été échangé. Chaque fois qu'il obtient un succès, il affiche parfois ce tableau delta, et c'est votre dossier de ce que les swaps ont été faits pour obtenir ce match.
void walk(char* a, char* b, int* delta, int budget, int& nSuccess){
delta[0] = 0;
if (budget < 0) return;
if (a[0] == '\0' && b[0] == '\0'){ // end of both strings
nSuccess++;
// print out the deltas
return;
}
if (a[0] == '\0') return; // excess chars in b
if (b[0] == '\0') return; // excess chars in a
if (a[0] == b[0]){ // first chars are equal, move to next
walk(a+1, b+1, delta+1, budget, nSuccess);
return;
}
for (int i = 1; a[i] != '\0'; i++){
delta[0] = i;
swap(a[0], a[i]);
if (a[0] == b[0]){
walk(a+1, b+1, delta+1, budget-1, nSuccess);
}
swap(a[0], a[i]);
delta[0] = 0;
}
}
void top(char* a, char* b){
int nSuccess = 0;
int delta[512];
for (int budget = 0; nSuccess==0; budget++){
walk(a, b, budget, delta, nSuccess);
}
}
La performance de l'algorithme est exponentielle N, où N est le nombre minimum de réarrangements nécessaires pour rendre le match des cordes. Il ne devrait donc probablement pas être utilisé tant que vous n'avez pas vérifié que chaque chaîne a le même nombre de caractères, , et ne l'utilisez que si vous avez besoin de voir cet enregistrement de réarrangements.
La question n'est pas claire, mais peut-être que vous pensez à quelque chose comme "distance d'édition" ou "distance Levenshtein". –
Que recherchez-vous de nouveau? Aussi la chaîne peut-elle avoir des caractères répétitifs? Et si oui, comment savez-vous quel 'c' de la deuxième chaîne est le 'c' du premier? –