编辑距离:Levenshtein Distance算法

题目链接:https://cn.vjudge.net/problem/51Nod-1183

 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric)。我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个字符(比如修改、插入、删除)所需要的最少次数。俄罗斯科学家Vladimir Levenshtein于1965年提出了这一概念。

 这个题主要用到dp思想,建立一个二维数组dp[1001][1001],dp[i][j]用于存放第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离;

首先我们很容易就可以知道dp[i][0]=i;dp[0][j]=j;    因为:第一个字串由i个变为第二个字串的0个,需要删除操作i次,同理第一个字串从0个变为第二字串的j个需要j次添加操作;

显然有以下动态转移方程:

  • if i == 0 且 j == 0,dp[i][j] = 0;
  • if i == 0 且 j > 0,dp[i][j]=j;
  • if i > 0 且j == 0,dp[i][j]=i;
  • if i ≥ 1  且 j ≥ 1 ,dp[i][j]== min{ dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

下面给出代码

#include <iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long int ll;
int main()
{
    char s[1001],t[1001];
    int dp[1001][1001];
    while(cin>>s>>t){
        memset(dp,0,sizeof dp);
        ll Slength=strlen(s);
        ll Tlength=strlen(t);
        for(int i=0;i<=Slength;i++)
            dp[i][0]=i;
        for(int j=0;j<=Tlength;j++)
            dp[0][j]=j;
        for(int i=1;i<=Slength;i++)
            for(int j=1;j<=Tlength;j++)
            {
                if(s[i-1]==t[j-1])
                    dp[i][j]=dp[i-1][j-1];
                else
                    dp[i][j] = min(dp[i-1][j-1], min(dp[i][j-1], dp[i-1][j]))+1;
                
            }
        cout<<dp[Slength][Tlength]<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41421433/article/details/82919126