PTA 7-3 編輯距離問題 (30 分)


一、實踐題目

設A和B是2個字符串。要用最少的字符操作將字符串A轉換為字符串B。這里所說的字符操作包括:
(1)刪除一個字符;
(2)插入一個字符;
(3)將一個字符改為另一個字符。
將字符串A變換為字符串B所用的最少字符操作數稱為字符串A到 B的編輯距離,記為d(A,B)。
對於給定的字符串A和字符串B,計算其編輯距離 d(A,B)。 輸入格式: 第一行是字符串A,文件的第二行是字符串B。 提示:字符串長度不超過2000個字符。 輸出格式: 輸出編輯距離d(A,B) 輸入樣例: 在這里給出一組輸入。例如: fxpimu xwrs 輸出樣例: 在這里給出相應的輸出。例如:
5

二、問題描述

題目大意是:給出兩個字符串 a、b,可以通過增刪改三個操作將a變成b,需要進行幾次操作。

三、算法描述

這道題類似於求最長公共子序列,但是還是更高級一點的。我用了res [2002][2002]來存儲結果,res[i][j]表示a的子串(下標從0到i)轉化為b的子串(下標從0到j)需要的操作次數,因此本題結果是res[strlen(a)][strlen(b)]。

那么問題就轉化為求出res數組。

本題的res數組:

a \ b x w r s
f 2 3 4
x 1 2 3 4
p 2 2 3 4
i 3 3 3 4
m 4 4 4 4
u 5 5 5 5

 

 

 

 

 

 

 

 

 

1、初始化:當strlen(a)=0,res[0][j]=j;同理可得res[i][0]=i;

2、當a[i-1]=b[j-1],則res[i][j]=res[i-1][j-1],即等於左上角的元素;

3、當a[i-1]!=b[j-1],有以下三種情況:

(1)若進行刪除操作:操作數加1,res[i][j]=res[i-1][j]+1;

(2)若進行增加操作:操作數加1,res[i][j]=res[i][j-1]+1;

(3)若進行替換操作:操作數加1,res[i][j]=res[i-1][j-1]+1;

  res[i][j]等於上面三種情況res[i][j]里的最小值

通過以上分析,我們可以發現填表規則是從上到下從左往右填一個大小為strlen(a)*strlen(b)的表格,兩層for循環對res數組操作:匹配時取左上的值;

失配時取 左上+1,左邊+1,右邊+1 三個數中的最小值,更新res[i]][j];

最后遞推到右下角dp[la][lb]為所求答案

代碼如下:

 

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 char a[2005], b[2005];
 5 int res [2002][2002];
 6 int temp = 1;
 7 int main (){
 8     cin >> a;
 9     cin >> b;
10     int la = strlen (a);
11     int lb = strlen (b);
12     for(int i = 0; i <= la; i++)  res[i][0] = i;
13     for(int i = 0; i <= lb; i++)  res[0][i] = i;
14 
15     for(int i = 1; i <= la; i++){
16             for(int j = 1; j <= lb; j++){
17                 if(a[i-1] == b[j-1]) temp = 0;    else temp = 1;
18                 int t = min(res[i-1][j] + 1,res[i][j-1] + 1);
19                 res[i][j] = min(t,res[i-1][j-1] + temp);
20             }        
21     }
22     
23     cout << res[la][lb];    
24     return 0;
25 }

 

 

 

四、算法時間及空間復雜度分析

采用dp思想,兩層for循環處理res數組,故時間復雜度為O(n^2)

五、心得體會

dp問題最重要的還是要找到問題的最優解子結構,然后建立遞推關系,確定好填表的順序。

多打題,才能提高、加深對算法的理解。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM