編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。
例如將kitten一字轉成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
動態規劃是解決該問題的常用思路。
首先,初看這個問題並聯絡到動態規劃是需要很強的數學抽象能力的,對於我這種抽象能力較弱的人來說,唯一能讓我聯絡到動態規劃的地方就是「最少」,「最 多」,這種字眼。假設我們決定試著使用動態規劃求解,那就要尋找該問題有沒有動態規劃的特點。如果能夠描述出問題的狀態,並且能夠得出乙個狀態轉移方程, 則很有可能能夠用動態規劃求解。
對於編輯距離問題,牽涉到源字串src和目標字串dest,顯然乙個狀態量是不好描述這種兩元關係的,那麼就使用了i,j兩個量來描述乙個狀態。對 於編輯距離的某個狀態,從源字串src的1->i 到目標字串dest的1->j 的最優編輯距離用c[i,j]來表示,那麼,現在的目標就是得到乙個狀態轉移方程,即怎樣從ti如果是插入操作,那麼必然是從c[i,j-1]轉化到c[i,j]的,此時是向src[1...i]最後增加乙個字元,轉化方程是
c[i,j]=c[i,j-1]+1
如果是刪除操作,那麼必然是從c[i-1,j]轉化到c[i,j]的,此時是將src[1...i]最後乙個字元刪除,轉化方程是
c[i,j]=c[i-1,j]+1
如果是替換操作,那麼必然是從c[i-1,j-1]轉化到c[i,j]的,此時考慮src[i]和dest[j]是否相同,如果相同則不需要替換直接轉移狀態,如果不同則發生替換操作,轉化方程是
c[i,j]=c[i-1,j-1] ; src[i]==dest[j]
c[i,j]=c[i-1,j-1]+1 ; src[i] != dest[j]
而當前狀態c[i,j]到底是從哪種子狀態轉移得來的,就要比較哪種是最優的選擇,即比較這三種轉化的最小距離,所以最終得到的轉移方程為:
所以,現在我們可以寫出動態規劃解這個問題了,給出偽**如下:
動態規劃 編輯距離
1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...
動態規劃 編輯距離
給定兩個序列x和y,求從乙個序列到另乙個序列所需變換的最小次數,這裡的變換包括刪除,新增和替換,每次只對乙個元素進行操作。演算法序言 這個題目有點像之前寫的最長公共子串行問題,也是用動態規劃的演算法。能夠應用動態規劃的題目有乙個特點就是具有最優子結構,就是整個問題的最優解會包含子問題的最優解,那麼我...
動態規劃 編輯距離
將乙個字串變為另乙個字串最小操作次數,您對單詞允許以下3種操作 a 插入字元 b 刪除字元 c 替換字元 例如 a horse 變成 b ros 想法 coding utf 8 def char array replace array1,array2 row len array1 col len a...