Eventuali duplicati:
Counting the swaps required to convert one permutation into anotherString distanza, trasposizioni solo
Sto cercando un algoritmo che conterebbe una sorta di distanza stringa dove consentito solo il funzionamento è la trasposizione di due adiacenti personaggi. Per esempio:
string1: "madre"
string2: "moterh"
distanza: 2 (primo swap "h" con "e" e ottenere "motehr" e poi "h" con la "r" con conseguente "moterh ")
So che la distanza di Damerau-Levenshtein è abbastanza simile a quel problema, ma richiede molta memoria (mi piacerebbe che fosse abbastanza veloce con parole fino a 1 000 000 caratteri). Ho già scritto questo:
int amo = 0;
for (int i = 0; i < n; i++)
{
if (fromString[i] == toString[i])
continue;
char toWhat = toString[i];
int where = -1;
for (int j = i; j < n; j++)
{
if (fromString[j] == toWhat)
{
where = j;
break;
}
}
while (where != i)
{
char temp = fromString[where];
fromString[where] = fromString[where - 1];
fromString[where - 1] = temp;
where--;
amo++;
}
}
cout << amo << endl;`
stringhe sono rappresentate come char [n] dove n è la loro lunghezza. Sono abbastanza sicuro che c'è un modo per farlo più velocemente e sarei molto grato se qualcuno mi dirà come farlo o scrivere un codice sorgente (meglio sarebbe Java/Python/C++ ma tutto è fantastico).
P.S. Scusami eventuali errori linguistici, non sono inglese e non ho ancora imparato la lingua.
Richiesto e risposta non molto tempo fa: http://stackoverflow.com/questions/7797540/some-swapping-with-bsort/7797838#7797838 – IVlad