編輯距離問題
時間限制(普通/Java):1000MS/3000MS 運行內存限制:65536KByte
總提交:60 測試通過:19
總提交: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。