1. 程式人生 > >算法第三章上級實踐報告

算法第三章上級實踐報告

() \n 縮小 其它 二維 發現 strlen 小問題 iostream

1. 實踐題目: 編輯距離問題

2. 問題描述

給出兩個字符串A和B,要用最少的字符操作將字符串A轉換為字符串B。字符操作包括: (1)刪除一個字符; (2)插入一個字符; (3)將一個字符改為另一個字符。編輯距離即將字符串A變換為字符串B所用的最少字符操作數,可記為d(A,B),求出給出的兩個字符串A和B的編輯距離。

3. 算法描述

定義一個dp[i][j]數組,用於記錄將 A串的前i個字符轉變為B串的前j個字符 所需的編輯距離,初始化dp[i][0]=i,dp[0][j]為j,表示將A串轉變為空串所需的編輯距離,以及將空串轉變為B串的編輯距離。dp[i-1][j]表示刪除A串中的一個字符,dp[i-1][j]表示添加A串中的一個字符,dp[i-1][j-1]表示修改A串中的一個字符,從A字符串的開頭開始遍歷,進行動態規劃操作,取各操作中的最小值。

代碼如下:

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int dp[10005][10005];
 5 char str1[2005],str2[2005];//str1表示字符串A,str2表示字符串B
 6 int main(){
 7     scanf("%s",str1);
 8     scanf("%s",str2);
 9     int len1 = strlen(str1),len2 = strlen(str2);
10     dp[0][0]=0;//初始化dp數組
11     for
(int i=1;i<=len1;i++){ 12 dp[i][0]=i; 13 } 14 for(int j=1;j<=len2;j++){ 15 dp[0][j]=j; 16 } 17 for(int i=1;i<=len1;i++){ 18 for(int j=1;j<=len2;j++){ 19 int temp=(str1[i-1]==str2[j-1]?0:1);//比較A串和B串的字符是否相同,相同則無需修改,不同則需要修改 20 dp[i][j]=min(min(dp[i-1
][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+temp);//比較修改,刪除以及添加的操作所需的編輯距離,取最小值 21 } 22 } 23 printf("%d\n",dp[len1][len2]); 24 }

4. 算法分析

空間復雜度:該動態規劃算法使用了一個二維數組,其中各維的取值與字符串的長度有關,故空間復雜度為O(len1*len2)。

時間復雜度:該算法使用了兩個循環進行初始化以及一個雙重循環進行各元素的遍歷與比較,其它操作復雜度為O(1),故時間復雜度為O(len1*len2)。

5. 心得體會

開始有些無從下手,因為認為各種操作可以從任何位置進行,沒有辦法縮小問題的規模,後來發現從任何一個位置開始進行隊最終答案都不會有影響,所以就可以運用動態規劃算法了,在和隊友討論了這一道題之後,我對動態規劃又有了更深的理解,也大致明白了一些問題的固定套路。

算法第三章上級實踐報告