1. 程式人生 > >編輯距離(動態規劃經典)

編輯距離(動態規劃經典)

1183 編輯距離

編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。
例如將kitten一字轉成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)

所以kitten和sitting的編輯距離是3。俄羅斯科學家Vladimir Levenshtein在1965年提出這個概念。給出兩個字串a,b,求a和b的編輯距離。

Input

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

Output

輸出a和b的編輯距離

Input示例

kitten
sitting

Output示例

3

思路:
狀態轉移:
1. 當str1[i] == str2[j] 時,需要改變的次數為0
2. 當str1[i] != str2[j] 時,需要改變的次數為
dp[i-1][j-1] + 1
dp[i-1][j] + 1
dp[i][j-1] + 1 中的最小值

程式碼:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; char str1[1100],str2[1100]; int dp[1100][1100]; int main() { while(~scanf("%s%s",str1,str2)) { int len1 = strlen(str1); int len2 = strlen(str2); for(int i=0; i<=len1; i++) dp[i][0] = i; for(int j=0; j<=len2; j++) dp[0
][j] = j; for(int i=1; i<=len1; i++) { for(int j=1; j<=len2; j++) { int t = (str1[i-1] == str2[j-1])?0:1; dp[i][j] = min(dp[i-1][j-1] + t, dp[i-1][j]+1); dp[i][j] = min(dp[i][j],dp[i][j-1]+1); } } printf("%d",dp[len1][len2]); } return 0; }