1. 實踐題目ios
7-3 編輯距離問題算法
2. 問題描述數組
設A和B是2個字符串。要用最少的字符操做將字符串A轉換爲字符串B。這裏所說的字符操做包括 (1)刪除一個字符; (2)插入一個字符; (3)將一個字符改成另外一個字符。 將字符串A變換爲字符串B所用的最少字符操做數稱爲字符串A到 B的編輯距離,記爲d(A,B)。 對於給定的字符串A和字符串B,計算其編輯距離 d(A,B)。測試
輸入格式:
第一行是字符串A,文件的第二行是字符串B。spa
提示:字符串長度不超過2000個字符。code
輸出格式:
輸出編輯距離d(A,B)對象
輸入樣例:
在這裏給出一組輸入。例如:blog
fxpimu
xwrs
輸出樣例:
在這裏給出相應的輸出。例如:遞歸
5內存
3. 算法描述
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 string A, B; 6 int n1, n2; 7 int n[2002][2002]; 8 9 int main() 10 { 11 getline(cin, A); 12 getline(cin, B); 13 int a = A.length(); 14 int b = B.length(); 15 for(int i=1; i<=a; i++) 16 { 17 n[i][0] = i; 18 } 19 for(int j=1; j<=a; j++) 20 { 21 n[0][j] = j; 22 } 23 for(int i=1; i<=a; i++) 24 { 25 for(int j=1; j<=b; j++) 26 { 27 if(A[i-1]==B[j-1]) 28 { 29 n[i][j] = n[i-1][j-1]; 30 } 31 else 32 { 33 n[i][j] = min(min(n[i-1][j]+1, n[i][j-1]+1),n[i-1][j-1]+1); 34 } 35 } 36 } 37 cout << n[a][b]; 38 return 0; 39 }
4. 算法時間&空間複雜度分析
代碼第23行到36行是本程序中嵌套層數最多的地方,共嵌套2層for循環,所以,算法時間複雜度級別爲O(n2)。
因爲本程序開闢了一個二維數組來存放從i到j的最短編輯距離,所以,算法空間複雜度級別也爲O(n2)。
5. 心得體會
我在初次看到這題的時候,因爲題目內容涉及到字符串的處理,我又最近自學了Python 3,深感Python字符串處理的簡便,因而使用Python以相同的遞歸方程寫了代碼提交,測試結果爲:
測試點0答案正確,耗時220ms,內存36116KB;測試點1答案正確,耗時215ms,內存35880KB;測試點2運行超時。
在進行各類嘗試都沒法成功使程序經過2號測試點的測試後,想到是與語言相關的問題,因而按同一個方程寫C++程序,一遍過,三個測試點的耗時分別爲3 / 5 / 44ms,內存佔用分別爲384 / 512 / 11436KB。
Python是一種動態類型、解釋型的語言。查閱資料得知,其萬物皆對象的特性就是致使其運行慢的一個緣由,Python的對象模型會帶來低效的內存訪問。
所以,對於時間和內存要求不高的題目能夠用Python寫(縮進爲主的代碼風格可讀性強,編寫簡單),若是要求較高,仍是使用C++爲好。
通過此次實踐,我還發現了C++裏面#include <string>以後string類的操做其實也很是便捷,並不輸給Python,須要掌握這種用法。