levenshtein字串編輯距離演算法

2021-08-03 16:28:22 字數 2249 閱讀 9203

指的是字串a向字串b轉換的最小步數。比如字串「abc」轉換成「a」最少需要刪除「b」,「c」兩個字元。字串操作有三種,乙個是新增插入,乙個是刪除,乙個是替換。該演算法最早由 levenshtein提出。

從a字串向b字串轉換,最重要的是考慮不要重複操作,比如 「abd」轉換成「abcd」只需要插入乙個「c」,而不用刪去「d」再插入「cd」。這就要看levenshtein distance演算法的思想了。

演算法基本原理:假設我們可以使用d[ i , j ]個步驟,表示將串s[ 1…i ] 轉換為串t [ 1…j ]所需要的最少步驟個數,在最基本的情況下,即在i等於0時,也就是說串s為空,那麼對應的d[0,j] 就是至少增加j個字元,使得s轉化為t。在j等於0時,也就是說串t為空,那麼對應的d[i,0] 就是減少i個字元,使得s轉化為t。

原理看起來複雜,其實就是規定了乙個二維陣列d。d[i][j]表示長度為i的字串s向長度為j的字串t的編輯距離。那麼我們知道,比如說字串s =「abceh「要編輯成字串t=「bbeh」,為了下標對應,我們可以設定乙個二維陣列d[5+1][4+1]。根據我們的設定,d[0][0]表示的就是長度為0的s(即為空)轉換成長度為0的t(也為空),需要0步操作。**如下:

黃色**就是d[0][0]的值,橙色的是d[0][1]的值,表示的就是長度為0的s(即為空)轉換成長度為1的t(即「b」),我們初始化的時候可以輕易算出**上方,左方的所有步數。我們現在開始求d[1][1](**中?問號)的值,它表示的是長度為1的字串s(即「a」)編輯成長度為1的字串t(即「b「)的距離。我們可以輕易知道這個值最小是1,操作是替換,既不是新增插入,也不是刪除。於是**便成了:

我們的繼續求下乙個問號所在的步數d[1][2]。我們為什麼要求這個從「a」轉換成「bb」的步數呢?原因就是為了比較字元編輯時候,插入、刪除、替換哪個操作是最優操作。比如這裡,」a」轉換成「bb」,剛剛我們已經求出了「a」轉換成「b」的最短編輯距離是1(也就是d[1][1]),因此現在變成了求「b」到「bb」的最短編輯距離,因為字串「a」在d[1][1]的時候已經被我們轉換成「b」了。因此d[1][2]的值應該為d[1][1]+1。我們以此類推新增**的第一行。

求第二行d[2][1](也就是「ab」=>「b「)的時候,這裡有乙個注意的地方,就是對於「ab」=>「b」的情況,levenshtein 是使用替換而不是刪除操作,也就是把「a」替換成空字元。所以這裡我們對字元「ab」的最優操作是把「a」替換成空字元,再拿「 b」與「b」比較。也就是d[2][1] = d[1][0]+(s[2-1]==t[1-1]?0:1) 這裡s,t的下標記得-1,因為是取陣列下標。所以我們得出結論:

d[m][n]步如果是新增,那麼d[m][n] = d[m][n-1]+1。d[m][n]步如果是刪除,那麼d[m][n] = d[m-1][n]+1。d[m][n]步如果是替換,那麼d[m][n] = d[m-1][n-1]+ (s[m -1] == t[n -1]?0:1)。d[i][j]的最優解就是它上一步的最優解加上上面三步的最小值。

function

countdistance

($s,$t)

if($lent == 0)

$dp = array();

for($i = 0; $i

<= $lens; $i++)

for($j = 0;$j

<= $lent;$j++)

for($i = 1;$i

<= $lens;$i++)

}return

$dp[$lens][$lent];

}

我們上面簡單的例子基本上實現了levenshtein演算法,當然還有兩個缺點:

HDOJ 1020 Encoding 字串編碼

hdoj 1020 encoding 字串編碼 description given a string containing only a z we could encode it using the following method 1.each sub string containing k sa...

DelphiXE Ansi字串UTF 8編碼判斷

找了半天也沒找到delphi語言直接可用的utf 8編碼判斷的 以下 摘抄改編於 7 使用者id xiaoc1026 回答的c ide為delphixe 判斷字串是否為 utf 8 編碼 輸入字串 輸入是否為 utf 8 編碼 function iswordsutf8 ansistr ansistr...

pyhton python的基礎字串和編碼

計算機只能處理數字,如果要處理文字,就必須把文字轉換為數字才能處理。最早8個位元 bit 等於1個位元組 byte 表示最大整數為255 11111111 美國採用ascii編碼,最早只有127個字元被編碼到計算機,而處理中文最少需要2個位元組,所以中國制定了gb2312編碼,各國有了各國的編碼,因...