洛谷P2758 編輯距離
阿新 • • 發佈:2020-10-10
題目描述
設A和B是兩個字串。我們要用最少的字元操作次數,將字串A轉換為字串B。這裡所說的字元操作共有三種:
1、刪除一個字元;
2、插入一個字元;
3、將一個字元改為另一個字元;
!皆為小寫字母!
輸入格式
第一行為字串A;第二行為字串B;字串A和B的長度均小於2000。
輸出格式
只有一個正整數,為最少字元操作次數。
輸入輸出樣例
輸入
sfdqxbw
gfdgw
輸出
4
AC程式碼
#include <bits/stdc++.h> using namespace std; int edit[2002][2002] = {}; int min3(int a, int b, int c) { return min(min(a, b), c); } int Levenshtein_Distance(string a, string b) { int lenA = a.length(), lenB = b.length(); for (int i = 1; i <= lenA; i++) { edit[i][0] = i; } for (int j = 1; j <= lenB; j++) { edit[0][j] = j; } for (int i = 1; i <= lenA; i++) { for (int j = 1; j <= lenB; j++) { edit[i][j] = min3(edit[i - 1][j] + 1, edit[i][j - 1] + 1, edit[i - 1][j - 1] + (a[i] != b[j])); //刪除,新增,修改三種方法中選擇一個距離最小值 } } return edit[lenA][lenB]; } int main() { string a, b; cin >> a >> b; a = "a" + a; b = "a" + b; cout << Levenshtein_Distance(a, b); }
思想
動態規劃。詳見 這裡