編輯距離(動態規劃經典)
阿新 • • 發佈:2019-01-24
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;
}