LD算法(Levenshtein Distance)又成为编辑距离算法(Edit Distance)。他是以字符串A通过插入字符、删除字符、替换字符变成另一个字符串B,那么操作的过程的次数表示两个字符串的差异。

LD算法的具体理论可以自行另外百度,这个该博主理论写的挺详细的,https://www.cnblogs.com/grenet/archive/2010/06/01/1748448.html

接下去就是我根据该理论的具体实现,我是一个半新手,可能对于代码写的有点啰嗦,希望大家能指出我的不足,跪谢。

 1 #include "stdio.h"
 2 #include "string.h"
 3 
 4 #define N 20
 5 #define T 20
 6 
 7 #define MIN(a,b,c) ((a < b ? a : b) > c ? c : (a < b ? a : b))
 8 #define MAX(a,b) (a > b ? a : b)
 9 
10 void show_matrix(int buf[N][T], int row , int col)
11 {
12     int i , j ;
13     for(i = 0 ; i <=row ; i++){
14         for(j = 0 ; j <= col ; j++){
15             printf("%d\t",buf[i][j]);
16         }
17         printf("\n");
18     }
19 }
20 
21 int LD_matrix(int matrix[N][T] , int row , int col , char * buf1, char * buf2)
22 {
23     int i , j ;
24     int left,top,lefttop;
25     int LD;
26     for(i = 1 ; i <= row ; i++){
27         for(j = 1 ; j <= col ; j++){
28             left = matrix[i][j-1];
29             top = matrix[i-1][j];
30             lefttop = matrix[i-1][j-1];
31             
32             if(buf1[i-1] == buf2[j-1]){
33                 matrix[i][j] = lefttop;
34             }else{
35                 matrix[i][j] = MIN(left , top ,lefttop) + 1;
36                 LD = matrix[i][j];
37             }
38         }
39     }        
40     printf("LD = %d\n",LD);
41     return LD;
42 }
43 
44 int main()
45 {
46     int row , col;
47     int i , j ;
48     char buf1[N] = "hello";
49     char buf2[N] = "hepppppppp";
50     int matrix[N][T] = {0};
51     float LD = 0;
52     float sim = 0.0;
53 
54     row = strlen(buf1);    
55     col = strlen(buf2);
56     
57     for(i = 0 ; i <= row ; i++){
58         matrix[i][0] = i;
59     }
60     for(j = 0 ; j <= col ; j++){
61         matrix[0][j] = j;
62     }
63     
64     LD = LD_matrix(matrix,row,col,buf1,buf2);
65     sim =  1 - LD / (MAX(row,col));
66     
67     printf("LD = %f\n",LD);
68     printf("similar = %.6f" ,sim);
69     return 070 
71 }