1298:計算字符串距離
時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
對於兩個不同的字符串,我們有一套操作方法來把他們變得相同,具體方法爲:
修改一個字符(如把“a”替換爲“b”);
刪除一個字符(如把“traveling”變爲“travelng”)。
比如對於“abcdefg”和“abcdef”兩個字符串來說,我們認爲可以通過增加/減少一個“g”的方式來達到目的。無論增加還是減少“g”,我們都僅僅需要一次操作。我們把這個操作所需要的次數定義爲兩個字符串的距離。
給定任意兩個字符串,寫出一個算法來計算出他們的距離。
【輸入】
第一行有一個整數n。表示測試數據的組數。
接下來共n行,每行兩個字符串,用空格隔開,表示要計算距離的兩個字符串。
字符串長度不超過1000。
【輸出】
針對每一組測試數據輸出一個整數,值爲兩個字符串的距離。
【輸入樣例】
3
abcdefg abcdef
ab ab
mnklj jlknm
【輸出樣例】
1
0
4
思路:狀態轉移方程:f[i][j]表示a[i]與b[j]的最優編輯距離。
首先f[i][0]和f[0][i]都初始化爲i,插入和刪除的步數
如果a[i]=b[j]那麼f[i][j]=f[i-1][j-1](不動)
否則f[i][j]=min(min(f[i-1][j],f[i][j-1])(插入,刪除),f[i-1]j-1)+1.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define N 3000
int f[N][N];
int len_a, len_b;
char a[N], b[N];
int main() {
int t;
scanf("%d", &t);
getchar();
while(t--) {
memset(f, 0, sizeof(f));
scanf("%s", a);
getchar();
scanf("%s", b);
len_a = strlen(a);
len_b = strlen(b);
for(int i = 1; i <= len_a; i++) f[i][0] = i;
for(int i = 1; i <= len_b; i++) f[0][i] = i;
for(int i = 1; i <= len_a; i++) {
for(int j = 1; j <= len_b; j++) {
if(a[i-1] == b[j-1]) {
f[i][j] = f[i-1][j-1];
}
else f[i][j] = min(min(f[i-1][j], f[i][j-1]), f[i-1][j-1]) + 1;
}
}
printf("%d\n", f[len_a][len_b]);
}
return 0;
}