Edit Distance 編輯距離

2021-07-13 07:59:07 字數 2127 閱讀 8367

編輯距離是一道經典的動態規劃(dynamic programing)問題。

下面將詳細地介紹解法。

我們先定義一下cache[ i ][ j ] ,表示,要將word1[0...i - 1] 轉化成word2[0..j - 1] 的最小步驟。

比如,我們的word1 = "aeee"       world2 = "adef"""a

def""

aeee

我們先來考慮一下base的情況,當word1 = "", 那麼它要多少步驟才能轉換成word2[0 ... j  - 1]?

顯然至少要 j 步才可以。所以,我們可以得到

1. cache[ i ] [ 0 ] = i;

2. cache[ 0 ][ j ] = j; ""

adef

""012

34a1

e2e3

e4接下來我們考慮更general 的情況。

假設我們想要得到word1[0...i - 1] 轉化成 word[0..j - 1]

當word[ i - 1] == word[ j - 1 ]  那麼我們不用再做其他操作,

cache[ i - 1 ] [ j - 1 ] = cache[ i  - 2] [ j - 2 ] 

(如表中'a' == 'a' 為例,我們可以在表中,填0)

接下來,當word[ i - 1 ] != word[ j  - 1] ,

我們可以有3種選擇。

1. 將

word1[i - 1] 替換成 word[ j - 1],   對應著: cache[ i - 1 ] [ j - 1 ] = cache[ i  - 2] [ j - 2 ]  + 1

2. 將 word1[i - 1] 刪掉,  對應著: 

cache[ i - 1 ] [ j - 1 ]  = cache[ i  - 2] [ j - 1 ] + 1 

3. 將 word[ j - 1] 插入到word[0... i - 1]中, 對應著:

cache[ i - 1 ] [ j - 1 ]  = 

cache[ i  - 1] [ j - 2 ] + 1 

最終,我們從這3種操作中,選擇步數中最小的。

比如在下表,a ! = d 我們可以選擇

1. a 替換成d,  需要 1 + 1  = 2步(因為已經知道 "" 轉成 "a" 需要1步)

2. a 刪掉,  需要 2 + 1 = 3 步 (因為已經知道了 "" 轉成 "ad" 需要2步)

3. 插入d,   需要 0 + 1 = 1 步 ( 因為我們已經知道 "a" 轉成"a"需要0步)

最終,填1 ""

adef

""012

34a1

0e2e

3e4

將上述的base case 和 general case 結合起來。

我們得到

1. cache[ i ] [ 0 ] = i;

2. cache[ 0 ] [ j ] = j;

3. 當 i > 0 , j > 0 , 

3.1 如果 word[ i - 1] = word [ j - 1] 

cache[ i ] [ j ] = cache[ i - 1] [ j - 1] 

3.2 如果 word[ i - 1] != word[ j - 1]

cache[ i ] [ j ] = min ( cache[ i - 1] [ j - 1] , cache[ i - 1] [ j ] , cache[ i ] [ j - 1] ) + 1

如我們的表最終會變成這樣:""a

def""

0123

4a10

123e

2111

2e32

212e

4332

2 **:

public int mindistance(string word1, string word2) 

for (int j = 0; j < n + 1; j++)

for (int i = 1; i < m + 1; i++) else }}

return cache[m][n];

}

編輯距離 Edit distance

插入乙個字元,例如 fj fxj 刪除乙個字元,例如 fxj fj 替換乙個字元,例如 jxj fyj 用分治的思想解決比較簡單,將複雜的問題分解成相似的子問題 假設字串 a,共 m 位,從a 1 到a m 字串 b,共 n 位,從b 1 到b n d i j 表示字串a 1 a i 轉換為b 1 ...

編輯距離(Edit Distance)

edit distance 1000 ms 65535 kb 568 2526 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編...

Edit Distance 編輯距離

nlpjoe 關注 今天看了stanford編輯距離 感覺寫得不錯,寫一篇部落格記錄下。為什麼?我們舉乙個實際例子 編輯距離dp公式 先不要急著看懂,我慢慢解釋。理解了上面的文字就理解編輯距離dp演算法了,寫得有點冗長。這裡給乙個帶damerau levenshteindistance距離的 其中新...