duplicados posible:
Counting the swaps required to convert one permutation into anotherCuerda distancia, transposiciones única
Busco un algoritmo que contaría algún tipo de distancia de cadena en la única operación permitida es de transposición de dos adyacentes caracteres. Por ejemplo:
cadena1: "madre"
string2: "moterh"
distancia: 2 (primero de intercambio "h" con "e" y obtener "Motehr" y luego "h" con "r" que resulta en "moterh ")
Sé que la distancia Damerau-Levenshtein es bastante similar a ese problema, sin embargo, requiere mucha memoria (me gustaría que funcione bastante rápido en palabras de hasta 1 000 000 caracteres). Ya he escrito esto:
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;`
Las cadenas se representan como char [n] donde n es su longitud. Estoy bastante seguro de que hay una manera de hacerlo más rápido y estaría muy agradecido si alguien me diga cómo hacerlo o escribir algún código fuente (lo mejor sería Java/Python/C++ pero cualquier cosa sería genial).
P.S. Disculpe cualquier error de idioma, no soy inglés y aún no domino ese idioma.
Preguntado y respondido no hace mucho tiempo: http://stackoverflow.com/questions/7797540/some-swapping-with-bsort/7797838#7797838 – IVlad