編輯距離:Levenshtein Distance演算法
阿新 • • 發佈:2018-11-19
題目連結: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; } }