設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 (1)刪除乙個字元; (2)插入乙個字元; (3)將乙個字元改為另乙個字元。 將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d(a,b)。 對於給定的字串a和字串b,計算其編輯距離 d(a,b)。
第一行是字串a,檔案的第二行是字串b。
輸出編輯距離d(a,b)
fxpimuxwrs
5
我們把問題一步步執行,每一步的執行都依賴上一步的決策(刪除、插入、替換),即子問題具有重疊性,同時子問題的求解都有最佳決策,所以這是乙個動態規劃問題。這裡定義乙個二維陣列d[i][j]儲存操作,表示字串i到字串j的距離。
1)假如i長度大於j進行刪除做作使i變成j, 則此時d[i][j] = d[i - 1][j] + 1;
2)假如i長度小於j進行插入操作,即刪除j末尾元素, 使i與j相等, 則此時d[i][j] = d[i][j - 1] + 1;
3) 假如i長度等於j,則判斷i和j最後乙個元素相不相等。若相等則d[i][j] = d[i-1][j-1] + 1.
得出遞迴公式:d[i][j] =min(d[i-1][j-1] + diff(), d[i][j-1]+1, d[i-1][j]+1)即i到j的最佳決策等於:上一步的最佳決策和對這一步決策(刪除、插入、替換)的最小值。
#include #includeusing
namespace
std;
int min(int a, int b, int
c) int m(string a, string
b)
for (int i = 0; i <= b.length(); i++)
//演算法實現
for (int i = 1; i <= a.length(); i++)
}return
e[a.length()][b.length()];
}int
main() {
string
i, j;
cin >> i >>j;
cout
<< d(i, j) << endl;
四、時空分析
因為用了乙個陣列儲存兩層for,所以時間複雜度為o(i*j),空間複雜度為o(i*j)。
五、結對總結
通過互相講述做題過程,從而對題目有了乙個更加清晰的認知,也對做題方法起到了很好的總結作用。
編輯距離問題(動態規劃)
問題描述 設a和b是兩個字串,要用最少的字元操作將字串a轉換為字串b,這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 修改乙個字元。將a轉換為b所用的最少字元運算元稱為a到b的編輯距離,記為d a b d中的a,b指的是a和b的長度,設計乙個演算法對任給的a,b,計算出d a b 問...
動態規劃之編輯距離問題
由公式可以看出,i 1,j 對應刪除操作,i,j 1 對應插入操作。可以這樣理解,現在耗費了di 1,j步操作將字串a 1,i 1 轉換成了b 1,j 則在將a 1,i 轉換成b 1,j 時,我們可以直接刪掉字元a i 問題變成a 1,i 1 轉換成b 1,j 從而dij就等於di 1,j 1。同理...
動態規劃 編輯距離
1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...