String 字符串距离,仅限换位
可能重复:String 字符串距离,仅限换位,string,algorithm,dynamic-programming,levenshtein-distance,edit-distance,String,Algorithm,Dynamic Programming,Levenshtein Distance,Edit Distance,可能重复: 我正在寻找一种算法,可以计算某种字符串距离,其中唯一允许的操作是两个相邻字符的换位。例如: 第1行:“母亲” string2:“moterh” 距离:2(首先将“h”与“e”交换,得到“motehr”,然后将“h”与“r”交换,得到“moterh”) 我知道Damerau–Levenshtein距离与这个问题非常相似,但它需要大量内存(我希望它能在多达1000个字符的单词上快速工作)。我已经写过: int amo = 0; for (int i = 0; i < n; i+
我正在寻找一种算法,可以计算某种字符串距离,其中唯一允许的操作是两个相邻字符的换位。例如:
第1行:“母亲”
string2:“moterh”
距离:2(首先将“h”与“e”交换,得到“motehr”,然后将“h”与“r”交换,得到“moterh”)
我知道Damerau–Levenshtein距离与这个问题非常相似,但它需要大量内存(我希望它能在多达1000个字符的单词上快速工作)。我已经写过:
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;`
intamo=0;
对于(int i=0;i cout基本上,您要求的是算法,但只允许转置(又称交换、旋转)操作。在《算法导论》一书中,您将找到实现旋转操作的线索,这是动态规划一章末尾的问题之一。此外,在《算法设计手册》一书中,在动态规划一章中,有一个完整的C-sans换位操作中的编辑距离算法的实现(同样,这是本章末尾提出的练习之一)
在上面的链接中,您会发现实现编辑距离算法的典型方法是使用动态规划,这需要O(mn)时间和O(mn)空间。据我所知,没有办法更快地完成这项工作(例如,在不到O(mn)的时间内),但您肯定可以在更少的空间内完成这项工作——聪明的话,您可以将空间减少到O(m),因为计算换位操作的成本只需要表中的当前行和前两行
也就是说,假设您只需要编辑距离。如果您需要实际的编辑操作,那么如果使用动态规划,您将无法使用O(mn)空间来重建解决方案。但是,您可以使用。不久前询问并回答:如果不要求读者购买或拥有几本计算机科学教科书,这将是一个更好的答案!库确实存在…这是编辑距离的一种限制情况,实际上更简单。您不需要完整的O(mn)算法,实际上它可以在O(n log n)中完成,使用合并排序,请参见复制关闭框中的链接答案。这是肯德尔头的距离。