字符串编辑距离

题目描述:给定一个源串和目标串,能够对源串进行如下操作:
   1.在给定位置上插入一个字符
   2.替换任意字符
   3.删除任意字符
写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。

此题反复出现,最近考的最多的是百度和Google的笔试面试经常考察。

字符串编辑距离_第1张图片

 

 D(n,m)即为字符串X[0...n-1]与Y[0...m-1]之间的最小编辑距离

 

 字符串编辑距离_第2张图片

 

 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)(网上也有)

你可能感兴趣的:(字符串)