您的位置:首页 > 其它

字符串编辑距离(C递归实现)

2013-04-21 20:05 169 查看
问题重现:

编辑距离:通过插入、删除、替换一个字符(和交换相邻字符)的操作,使得字符串A和字符串B相同,而最少的操作次数就是编辑距离。

如字符串abcd和aca的距离是2

动态规划得到转移状态方程:

1. dis(s1,"") = d("",s1) = |s1|

dis("c1","c2") = c1 == c2 ? 0 : 1;

2. dis(s1+c1,s2+c2) = min( dis(s1,s2)+ c1==c2 ? 0 : 1 , //替换

dis(s1+c1,s2)+1, //s2中插入c1,等价于s1后删除c1

dis(s1,s2+c2)+1 ); //s2后删除c2,等价于s1中插入c2

即:

f[i][j]=min{f[i-1][j-1]+c1==c2?0:1,

f[i][j-1]+1,

f[i-1][j]+1}

C递归实现代码

#include<stdio.h>
#include<string.h>

/*递归计算编辑距离 删除、替换、插入 (i行,j列)*/
int dis(char *s,char *t,int j,int i){
int a,b,c,min;
if(i>0 && j>0){
a=t[i-1]==s[j-1]?dis(s,t,j-1,i-1):dis(s,t,j-1,i-1)+1;
b=dis(s,t,j,i-1)+1;
c=dis(s,t,j-1,i)+1;
min=a>b?b:a;
return min>c?c:min;
}else if(i==0 && j==0){
return t[0]==s[0]?0:1;
}else if(i==0){
return j;
}else if(j==0){
return i;
}
}

void main(){
char *s="acdx";
char *t="acxx";
printf("\n\n%s和%s之间的距离为:%d\n\n",s,t,dis(s,t,strlen(s),strlen(t)));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: