字符串编辑距离(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递归实现代码
编辑距离:通过插入、删除、替换一个字符(和交换相邻字符)的操作,使得字符串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))); }
相关文章推荐
- 求字符串编辑距离的递推和递归实现
- java实现编辑距离算法,计算字符串相似度
- 字符串编辑距离的c#实现
- 字符串相关算法(编辑距离,最大公共字串)C#实现版
- Python实现求两个字符串的最短编辑距离
- 字符串反转-编辑距离-约瑟夫环的实现
- 字符串编辑距离的几种实现
- C++实现两个字符串之间的Levenshtein Distance(编辑距离)
- 【Algorithm】字符串编辑距离(Levenshtein距离)C++算法实现
- 【动态规划】字符串最小编辑距离Java实现
- 相似字符串(字符串编辑)最短距离(非递归版本)
- 动态规划(最小字符串编辑距离实现)
- 用C#实现字符串相似度算法(编辑距离算法 Levenshtein Distance)
- 华为OJ 计算字符串相似度或者编辑距离 JAVA
- 【学习笔记】字符串编辑距离(字符串相似度)
- 《Java数据结构与算法》笔记-CH6-递归-1递归实现全排列字符串
- 8.动态规划(1)——字符串的编辑距离
- POJ2146 Confusing Login Names [最小字符串编辑距离]
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离