1. 程式人生 > >編輯距離:Levenshtein Distance演算法

編輯距離: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;
    }
}