题目描述:给定一个源串和目标串,能够对源串进行如下操作:
1.在给定位置上插入一个字符
2.替换任意字符
3.删除任意字符
写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。
此题反复出现,最近考的最多的是百度和Google的笔试面试经常考察。
D(n,m)即为字符串X[0...n-1]与Y[0...m-1]之间的最小编辑距离
1 #include <iostream> 2 #include <assert.h> 3 #include <stdlib.h> 4 5 int func31(char a[], int n, char b[], int m) 6 { 7 int i, j; 8 int tmp; 9 int *d; 10 11 assert( a && n>0 && b && m>0); 12 13 d = new int[(n+1)*(m+1)]; 14 15 for (i=0; i<=n; i++) 16 { 17 d[m*i + 0] = i; 18 } 19 for (j=0; j<=m; j++) 20 { 21 d[m*0 + j] = j; 22 } 23 24 for (i=1; i<=n; i++) 25 { 26 for (j=1; j<=m ; j++) 27 { 28 d[m*i + j] = __min( d[m*(i-1)+j]+1 , d[m*i +j-1]+1); 29 if (a[i-1] == b[j-1]) 30 { 31 d[m*i+j] = __min(d[m*i+j], d[m*(i-1)+j-1]); 32 } 33 else 34 { 35 d[m*i+j] = __min(d[m*i+j], d[m*(i-1)+j-1]+2); 36 } 37 } 38 } 39 40 tmp = d[m*n + m]; 41 delete[] d; 42 43 return tmp; 44 } 45 46 int main() 47 { 48 char stra[] = "asfevee"; 49 char strb[] = "safevee"; 50 51 cout<<func31(stra, strlen(stra), strb, strlen(strb))<<endl; 52 53 54 return 0; 55 }
P.S. 忙实习面试,木有更多解释看一PDF(MinimumEditDistance.pdf)(网上也有)