thể trùng lặp:
Counting the swaps required to convert one permutation into anotherChuỗi xa, chuyển vị chỉ
Tôi đang tìm một thuật toán mà sẽ đếm một số loại khoảng cách chuỗi nơi duy nhất được phép hoạt động là vận dụng hai liền kề nhân vật. Ví dụ:
string1: "mother"
string2: "moterh"
khoảng cách: 2 (hoán đổi đầu tiên "h" với "e" và nhận "motehr" và sau đó "h" với "r" dẫn đến "moterh ")
Tôi biết rằng khoảng cách Damerau – Levenshtein khá giống với vấn đề đó, tuy nhiên nó đòi hỏi nhiều bộ nhớ (tôi muốn nó hoạt động khá nhanh trên các từ lên tới 1 000 000 ký tự). Tôi đã viết điều này:
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;`
Chuỗi được biểu diễn bằng char [n] trong đó n là chiều dài của chúng. Tôi khá chắc chắn có một cách để làm điều đó nhanh hơn và tôi sẽ rất biết ơn nếu ai đó sẽ cho tôi biết làm thế nào để làm điều đó hoặc viết một số mã nguồn (tốt nhất sẽ là Java/Python/C++ nhưng bất cứ điều gì là tuyệt vời).
P.S. Xin lỗi vì bất kỳ lỗi ngôn ngữ nào, tôi không phải là tiếng Anh và tôi vẫn chưa nắm vững được ngôn ngữ đó.
Đã hỏi và trả lời cách đây không lâu: http://stackoverflow.com/questions/7797540/some-swapping-with-bsort/7797838#7797838 – IVlad