2988_計算字串距離
阿新 • • 發佈:2018-12-15
/* Name: 2988_計算字串距離 Copyright: Author: Date: 26-06-18 21:32 Description: 2988_計算字串距離 檢視 提交 統計 提問 總時間限制: 1000ms 記憶體限制: 65536kB 描述 對於兩個不同的字串,我們有一套操作方法來把他們變得相同,具體方法為: 修改一個字元(如把“a”替換為“b”) 刪除一個字元(如把“traveling”變為“travelng”) 比如對於“abcdefg”和“abcdef”兩個字串來說,我們認為可以通過增加/減少一個“g”的方式來達到目的。無論增加還是減少“g”,我們都僅僅需要一次操作。我們把這個操作所需要的次數定義為兩個字串的距離。 給定任意兩個字串,寫出一個演算法來計算出他們的距離。 輸入 第一行有一個整數n。表示測試資料的組數, 接下來共n行,每行兩個字串,用空格隔開。表示要計算距離的兩個字串 字串長度不超過1000。 輸出 針對每一組測試資料輸出一個整數,值為兩個字串的距離。 樣例輸入 3 abcdefg abcdef ab ab mnklj jlknm 樣例輸出 1 0 4 */ #include<iostream> #include<cstring> #include<string> using namespace std; const int INF = 2000; const int N = 1000; int B[N+1][N+1]; int B1[N+1][N+1]; string X, Y; int LCSLength(int i, int j);//自頂向下的備忘錄演算法 int LCSLength_1(int n, int m);//動態規劃 int main() { int n; cin >> n; while (n-- > 0) { cin >> X >> Y; for (int i=0; i<=N; i++) for (int j=0; j<=N; j++) B[i][j] = INF; // cout << LCSLength(X.length(), Y.length()) << endl; memset(B1, 0, sizeof(B1)); cout << LCSLength_1(X.length(), Y.length()) << endl; } return 0; } int LCSLength(int i, int j)//自頂向下的備忘錄演算法 { if (B[i][j] != INF) return B[i][j]; if (i == 0) //字串X的長度為0,插入j個字元 B[i][j] = j; else if (j == 0) //字串Y的長度為0,刪除i個字元 B[i][j] = i; else if (X[i-1] == Y[j-1])//兩字元相同,無需編輯 B[i][j] = LCSLength(i-1, j-1); else //兩字元不同,從插入,刪除和修改3個操作中挑選編輯距離最短的,再加1 B[i][j] = min(min(LCSLength(i-1, j), LCSLength(i, j-1)), LCSLength(i-1, j-1)) + 1; return B[i][j]; } int LCSLength_1(int n, int m)//動態規劃 { for (int i=1; i<=n; i++)//字串Y的長度為0,刪除i個字元 B1[i][0] = i; for (int j=1; j<=m; j++)//字串X的長度為0,插入j個字元 B1[0][j] = j; for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { if (X[i-1] == Y[j-1]) B1[i][j] = B1[i-1][j-1]; else B1[i][j] = min(min(B1[i-1][j], B1[i][j-1]), B1[i-1][j-1]) + 1; } } return B1[n][m]; }