- 修改一个字符(如把“a”替换为“b”)
- 删除一个字符(如把“traveling”变为“travelng”)
比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。
给定任意两个字符串,写出一个算法来计算出他们的距离。
- int similarity(char* str1, char* str2)
- {
- if(strlen(str1)==0)
- return strlen(str2);
- else if(strlen(str2)==0)
- return strlen(str1);
- else if( *str1 == *str2 ) // this step is very important!
- return similarity(str1+1, str2+1) ;
- else // if( *str1!=*str2 ) then we have the following
- return min( min( 1+similarity(str1+1, str2),
- 1+similarity(str1, str2+1) ),
- 1+similarity(str1+1, str2+1) );
- }
以题中的一个例子举例,字符串a=“jlknm”,b=“mnklj”,则可构造一个6×6的二维数组array,并将二维数组的第一行和第一列初始化为如下,因为一个空字符串和任意一个字符串的距离始终为该字符串的长度。
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
using namespacestd;
const int maxn =1005;
int num[2][maxn];
string a,b;
int f(int p,int q)
{
memset(num,0, sizeof(num));
int pos =0;
for (int i =0; i <= q; i ++) {// 1
num[pos][i] = i;
}
for (int i =1; i <= p; i ++) {
pos = !pos;
num[pos][0] = i;// 2 对num进行初始化,即一个长度为k的string与空字符串的距离为k。 //e.g. a与aaa 距离为2
for (int j =1; j <= q; j ++ ) {
if (a[i -1] == b[j -1]) {
num[pos][j] =num[!pos][j - 1];
}
else {
num[pos][j] =1 + min(num[!pos][j -1],min(num[!pos][j],num[pos][j - 1])) ;}
}
}
returnnum[pos][q];
}
int main()
{
int n;
cin >> n;
for (int i =0; i < n; i ++) {
cin >>a >> b;
int p =a.size(),q =b.size();
cout <<f(p,q) <<endl;
}
return0;
}