1. 程式人生 > >51nod 1183 編輯距離

51nod 1183 編輯距離

eve 初始 %d algo color 包括 字串 替換 之間

編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。 例如將kitten一字轉成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以kitten和sitting的編輯距離是3。俄羅斯科學家Vladimir Levenshtein在1965年提出這個概念。 給出兩個字符串a,b,求a和b的編輯距離。

輸入

第1行:字符串a(a的長度 <= 1000)。
第2行:字符串b(b的長度 <= 1000)。

輸出

輸出a和b的編輯距離

輸入樣例

kitten
sitting

輸出樣例

3

這是一道動態規劃的題目,顯然兩個串的長度並沒有要求相同,我們需要對比任意兩個字符,假設前面都已經變的相等,那麽到了a[i]和b[j]的位置,如何選擇呢,我們設dp[i][j]為a[i - 1]和b[j - 1]的對應情況,如果兩字符相等,dp[i][j]可以設為dp[i - 1][j - 1],不需要做操作,如果不相等,就在dp[i - 1][j - 1]基礎上加1,這是做的替換操作,我們還可以做插入操作和刪除操作,這就建立在dp[i - 1][j]或dp[i][j - 1]的基礎上了,具體怎麽樣我們都得取最小的編輯距離,
所以狀態轉移方程為dp[i][j] = min(dp[i - 1][j - 1] + (s[i - 1] == t[j - 1] ? 0 : 1),min(dp[i - 1][j],dp[i][j - 1]) + 1);
不過需要註意初始化問題,dp[0][0]設為0,兩個空串的編輯距離是0的,對於dp[i][0]的編輯距離是i要麽a變為空串要麽b變為b變成a,操作次數都是i,同樣的dp[0][j]也要初始化,如此後面的才能借用,否則是不對的。

代碼:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include
<cstring> #include<algorithm> #define MAX 1000 #define mod 1000000000 using namespace std; int dp[MAX + 1][MAX + 1]; char s[MAX + 1],t[MAX + 1]; int main() { scanf("%s%s",s,t); int slen = strlen(s),tlen = strlen(t); for(int i = 1;i <= slen;i ++) { dp[i][0] = i; } for(int i = 1;i <= tlen;i ++) { dp[0][i] = i; } for(int i = 1;i <= slen;i ++) { for(int j = 1;j <= tlen;j ++) { dp[i][j] = min(dp[i - 1][j - 1] + (s[i - 1] == t[j - 1] ? 0 : 1),min(dp[i - 1][j],dp[i][j - 1]) + 1); } } printf("%d",dp[slen][tlen]); }



51nod 1183 編輯距離