編輯距離,又稱Levenshtein距離,是指兩個字串之間,由一個轉成另外一個所需的最少編輯操做次數。許可的編輯操做包括將一個字符替換成另外一個字符,插入一個字符,刪除一個字符。spa
例如將kitten一字轉成sitting:ip
動態規劃是解決該問題的經常使用思路。字符串
首先,初看這個問題並聯繫到動態規劃是須要很強的數學抽象能力的,對於我這種抽象能力較弱的人來講,惟一能讓我聯繫到動態規劃的地方就是「最少」,「最 多」,這種字眼。假設咱們決定試着使用動態規劃求解,那就要尋找該問題有沒有動態規劃的特色。若是可以描述出問題的狀態,而且可以得出一個狀態轉移方程, 則頗有可能可以用動態規劃求解。get
對於編輯距離問題,牽涉到源字符串src和目標字符串dest,顯然一個狀態量是很差描述這種兩元關係的,那麼就使用了i,j兩個量來描述一個狀態。對 於編輯距離的某個狀態,從源字符串src的1->i 到目標字符串dest的1->j 的最優編輯距離用c[i,j]來表示,那麼,如今的目標就是獲得一個狀態轉移方程,即怎樣從ti<i, tj<j 的這些子狀態轉移到i,j?在編輯距離的可選操做中,只有插入、刪除和替換,那麼子狀態也只可能由這三種方式轉移獲得如今狀態。數學
若是是插入操做,那麼必然是從c[i,j-1]轉化到c[i,j]的,此時是向src[1...i]最後增長一個字符,轉化方程是it
c[i,j]=c[i,j-1]+1class
若是是刪除操做,那麼必然是從c[i-1,j]轉化到c[i,j]的,此時是將src[1...i]最後一個字符刪除,轉化方程是im
c[i,j]=c[i-1,j]+1margin
若是是替換操做,那麼必然是從c[i-1,j-1]轉化到c[i,j]的,此時考慮src[i]和dest[j]是否相同,若是相同則不須要替換直接轉移狀態,若是不一樣則發生替換操做,轉化方程是top
而當前狀態c[i,j]究竟是從哪一種子狀態轉移得來的,就要比較哪一種是最優的選擇,即比較這三種轉化的最小距離,因此最終獲得的轉移方程爲:
因此,如今咱們能夠寫出動態規劃解這個問題了,給出僞代碼以下: