第九章 動態規劃-1298:計算字符串距離

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章