Похоже, что вы действительно хотите, это что-то вроде расстояния Левенштейна (но не совсем так).
Вот первый разрез.
Что нужно сделать, это пройтись по дереву игр со всеми возможными перестановками a , чтобы увидеть, соответствуют ли они b .
Он связывает стоимость с каждой перестановкой, выраженную в уменьшении бюджета .
Сначала идет внешний цикл с бюджетом 0, поэтому допускается только точное совпадение.
Если он не увенчался успехом, он обходится с бюджетом 1, находя все совпадения, содержащие только одну перестановку.
Если это не принесло успеха, тогда он идет с бюджетом 2 и т. Д.
При совпадении он хранит массив целых чисел delta , указывающий, как далеко каждый элемент из a был поменяен местами.
Всякий раз, когда он добивается успеха, он так же распечатывает этот дельта-массив, и это ваша запись того, что было сделано подкачки, чтобы получить это соответствие.
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);
}
}
Производительность алгоритма экспоненциально в N, где N - минимальное количество перестановок, необходимое для согласования строк.
Так что, вероятно, его не следует использовать до тех пор, пока вы не убедитесь, что каждая строка имеет одинаковое количество каждого символа,
и используйте его, только если вам нужна эта запись о перестановках.