編輯距離是一道經典的動態規劃(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距離的 其中新...