编辑距离

参考链接,写的超级详细了

题目:链接

题目描述

设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
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/ellen-mylife/p/11001016.html