動態規劃之編輯距離

2021-08-10 12:10:46 字數 1846 閱讀 1817

【演算法問題描述】

設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 (1)刪除乙個字元; (2)插入乙個字元; (3)將乙個字元改為另乙個字元。 將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d(a,b)。 對於給定的字串a和字串b,計算其編輯距離 d(a,b)。 【

問題分析

】 假設有兩個字串

s1[1, s1.length()]和s2[1, s2.length()],倘若s1[s1.length()] == s2[s2.length()],那麼即只需要計算s1[1, s1.length() - 1] 替換成 s2[1, s2.length() - 1]需要變換的次數即可。並以此類推下去。那麼如果不相等的時候,就需要進行三種基本操作:

1. 插入乙個字元

;2.刪除乙個字元;3.更改乙個字元。

那麼這三個操作需要的步驟最少的那個操作即為兩個字串長度不相等情況下該點的編輯距離。(動態規劃的思想)

【解決方案】 先定義了乙個記錄結果的二維陣列

result[s1.length()+1][s2.length()+1],(之所以要設定多一位來儲存資料,是考慮了當兩個字串其中乙個或兩個為空串時的情況)。顯然,當j = 0時,result[i][0] = i;同理,當i = 0時,result[0][j] = j。

那麼遞迴式為

result[i][j] =

其中addition為增加乙個字元的操作,定義為int addition = result[i][j - 1] + 1

deletion為刪除乙個字元的操作,定義為int deletion = result[i - 1][j] + 1

sub為替換乙個字元的操作,定義為int sub = result[i - 1][j - 1] + isequals

(isequals = 0或1,當s1[i]等於s2[j]時(實際操作時為s1[i - 1]和s2[j - 1]相等時,因為是從i=j=1開始迴圈)取0, 表示接下來無需操作;反之則表示接下來需要操作, 於是編輯距離加1。以下用乙個例子說明result的記錄過程:

如:  abcc 與 abxy  

下標       0   1   2   3   4

0   a   b   c   c

0    0    

0   1   2   3   4

1    a    

1   0   1   2   3

2    b    

2   1   0   1   2

3    x    

3   2   1   1   2

4    y    

4   3   2   2   2

可見,最後的輸出結果為result[s1.length()][s2.length()]。

【具體實現**】

int result[lengths1 + 1][lengths2 + 1];

//當i = 0

而 j > 0

時, result[0][j] = j;

反之同理,故先在此宣告

for (int i = 0; i <= lengths1; i++)

for (int j = 0; j <= lengths2; j++)

for (int i = 1; i <= lengths1; i ++) }

【思維誤區】

我剛開始的時候,是跟以前做題的習慣一樣,喜歡從陣列的下標0開始標記,一直到length - 1。於是在編輯距離問題上就會發現進了乙個大坑。是因為當某一字串為空串時,用1作為開始下標的話,編輯距離應該為非空串字串的長度;而若採用下標0為開始下標時,則編輯距離會比正確答案少1。

動態規劃之編輯距離問題

由公式可以看出,i 1,j 對應刪除操作,i,j 1 對應插入操作。可以這樣理解,現在耗費了di 1,j步操作將字串a 1,i 1 轉換成了b 1,j 則在將a 1,i 轉換成b 1,j 時,我們可以直接刪掉字元a i 問題變成a 1,i 1 轉換成b 1,j 從而dij就等於di 1,j 1。同理...

動態規劃之編輯距離 2021 1 29

s1 family s2 frame s1 family s2 frame 編輯距離 4d 012 3451 0123 4211 1233 2221 2433 3225 4443 3655 544 process exited after 10.78 seconds with return valu...

376,動態規劃之編輯距離

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 ...