编辑距离及编辑距离算法

编辑距离概念描述:

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

  1. sitten (k→s)
  2. sittin (e→i)
  3. sitting (→g)

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

 

问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符

 

解析:

首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。

显然可以有如下动态规划公式:

  • if i == 0 且 j == 0,edit(i, j) = 0
  • if i == 0 且 j > 0,edit(i, j) = j
  • if i > 0 且j == 0,edit(i, j) = i

  • if i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。编辑距离及编辑距离算法_第1张图片
  • 编辑距离及编辑距离算法_第2张图片
  • 计算edit(1, 1),edit(0, 1) + 1 == 2,edit(1, 0) + 1 == 2,edit(0, 0) + f(1, 1) == 0 + 1 == 1,min(edit(0, 1),edit(1, 0),edit(0, 0) + f(1, 1))==1,因此edit(1, 1) == 1。 依次类推:
  • 编辑距离及编辑距离算法_第3张图片
  • edit(2, 1) + 1 == 3,edit(1, 2) + 1 == 3,edit(1, 1) + f(2, 2) == 1 + 0 == 1,其中s1[2] == 'a' 而 s2[1] == 'f'‘,两者不相同,所以交换相邻字符的操作不计入比较最小数中计算。以此计算,得出最后矩阵为:
  • 编辑距离及编辑距离算法_第4张图片
#include    
#include    
char s1[1000],s2[1000];   
int min(int a,int b,int c) {   
    int t = a < b ? a : b;   
    return t < c ? t : c;   
}   
void editDistance(int len1,int len2) {   
	int d[len1+1][len2+1];
    int i,j;   
    for(i = 0;i <= len1;i++)   
        d[i][0] = i;   
    for(j = 0;j <= len2;j++)   
        d[0][j] = j;  
		 
    for(i = 1;i <= len1;i++)   
        for(j = 1;j <= len2;j++) { 
			if(s1[i-1] == s2[j-1])  
            	d[i][j] = d[i-1][j-1];
            else{
            	
            	int deletion = d[i-1][j] + 1;   //删除 
            	int insertion = d[i][j-1] + 1;   //插入 
           	int substitution = d[i-1][j-1] + 1;// 替换 
            	d[i][j] = min(deletion,insertion,substitution);
				  
			}
             
        } 
	for(i=0;i<=len1;i++){
		for(j=0;j<=len2;j++){
			printf("%d ",d[i][j]);
		}
		printf("\n");
	}  
    printf("%d\n",d[len1][len2]); 
}   
int main(void) { 
	scanf("%s %s",s1,s2) ;   
    editDistance(strlen(s1),strlen(s2));   
    return 0;
} 


你可能感兴趣的:(编辑距离及编辑距离算法)