可能重复:
计算将一种排列转换为另一种排列所需的交换次数
我正在寻找一种算法来计算某种字符串距离,其中只允许操作是两个相邻字符的转置。例如:
string1: "mother"
string2: "moterh"
distance: 2 (首先将“h”与“e”交换并得到“motehr”,然后将“h”与“r”交换为“moterh”)
我知道 Damerau –Levenshtein 距离与该问题非常相似,但是它需要大量内存(我希望它在最多 1 000 000 个字符的单词上运行得非常快)。我已经写了这个:
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;`
字符串表示为 char[n],其中 n 是它们的长度。我很确定有一种方法可以更快地做到这一点,如果有人能告诉我如何做到这一点或编写一些源代码(最好是 Java/Python/C++,但任何事情都很棒),我将非常感激。
PS 请原谅我的语言错误,我不是英语,我还没有掌握那种语言。