编辑距离
参考链接,写的超级详细了
题目:链接
题目描述
设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B 所用的最少字符操作数称为字符串A到B 的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。
输入
第一行是字符串A,文件的第二行是字符串B。字符串长度不大于2000。
输出
输出距离d(A,B)
样例输入
复制
fxpimu xwr
样例输出
5
下面就记录一下代码:
#include<bits/stdc++.h> using namespace std; #define INF 99999 int dp[2005][2005]; /*dp[i][j]表示表示A串从第0个字符开始到第i个字符和B串从第0个 字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。*/ char a[2005],b[2005]; //a,b字符串从下标1开始 int min(int x,int y,int z) { int m; if(x<y) m=x; else m=y; if(m>z) return z; else return m; } int EditDis() { int len1 = strlen(a+1); int len2 = strlen(b+1); //初始化 for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) dp[i][j] = INF; for(int i=1;i<=len1;i++) dp[i][0] = i; for(int j=1;j<=len2;j++) dp[0][j] = j; for(int i=1;i<=len1;i++) { for(int j=1;j<=len2;j++) { int flag; if(a[i]==b[j]) flag=0; else flag=1; dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+flag); //dp[i-1][j]+1表示删掉字符串a最后一个字符a[i] //dp[i][j-1]+1表示给字符串添加b最后一个字符 //dp[i-1][j-1]+flag表示改变,相同则不需操作次数,不同则需要,用flag记录 } } return dp[len1][len2]; } int main() { scanf("%s",a); scanf("%s",b); int len1 = strlen(a); int len2 = strlen(b); //移位 for(int i=len1;i>0;i--) { a[i]=a[i-1]; } for(int i=len2;i>0;i--) { b[i]=b[i-1]; } int ans=EditDis(); printf("%d\n",ans); return 0; }