算法之動態規划——編輯距離問題


編輯距離問題

時間限制(普通/Java):1000MS/3000MS 運行內存限制:65536KByte
總提交:60 測試通過:19

描述

設A和B是2個字符串。要用最少的字符操作將字符串A轉換為字符串B。這里所說的字符操作包括

(1)刪除一個字符;(2)插入一個字符;(3)將一個字符改為另一個字符。

將字符串A變換為字符串B所用的最少字符操作數稱為字符串A到B的編輯距離,記為d(A,B)。試設計一個有效算法,對任給的2個字符串A和B,計算出它們的編輯距離d(A,B)。

對於給定的字符串A和字符串B,編程計算其編輯距離d(A,B)。

輸入

輸入數的第一行是字符串A,文件的第二行是字符串B。

輸出

輸出編輯距離d(A,B)的第1行中。

樣例輸入

fxpimu
xwrs

樣例輸出

5

題目來源

算法設計與實驗題解

題目來源(http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1224

 

對於此題,使用動態規划算法是很容易得出最優值的,首先使用二維數組m[i][j]儲存由字符串s[1, i]與t[1, j]編輯的最短距離,這樣的話,很容易得出遞歸式:

具體代碼如下:

 1 int edictlen(char *s, char *t)
 2 {
 3     int len1=strlen(s);
 4     int len2=strlen(t);
 5     int i,j;
 6     int **m=new int *[len1+2];
 7     for(i=0; i<=len1; i++)
 8         m[i]=new int [len2];
 9     m[0][0]=0;
10     for(i=1; i<len1; i++) m[i][0]=i;
11     for(i=1; i<len2; i++) m[0][i]=i;
12     for(i=1; i<len1; i++)
13     {
14         for(j=1; j<len2; j++)
15         {
16             if(s[i]==t[j]) m[i][j]=m[i-1][j-1];
17             else m[i][j]=min(m[i-1][j-1],m[i-1][j],m[i][j-1])+1;
18         }
19     }
20     int temp=m[len1-1][len2-1];
21     
22     for (i=0;i<=len1;i++)
23     {
24         delete[] m[i];
25     }
26     delete[] m;
27     return temp;
28 }

注意,字符串是從1開始算起,使用數組輸入時也需要從1開始。還有min函數就是三個數中取最小值。

本代碼經測試已經AC。


免責聲明!

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



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