編輯距離(edit distance)是針對兩個個字串s1和s2的差異程度進行量化,計算方式是看至少需要多少次的處理才能將s1變成s2(和s2變成s1是等價的),用 editdis(s1,s2)表示。
其中處理的方式有三種:
1.插入乙個字元
2.刪除乙個字元
3.替換乙個字元
這是嚴格意義上的距離,滿足」距離三公理":
1.對稱性,editdis(s1,s2) = editdis(s2,s1)
2.非負性,editdis(s1,s2) >= 0, 當且僅當s1=s2時,等號成立
3.三角不等式,editdis(s1,s2) + editdis(s1,s3) >= editdis(s2,s3)
編輯距離是一種非常實用的距離。
1.nlp領域
在nlp中,常用於拼寫的糾錯。對於乙個錯誤的輸入字串s,我們可以通過計算與其」長得「比較類似的字串s1,s2,s3,…,sn之間的編輯距離,從而判斷s的正確寫法更有可能是誰。
2.基因工程領域
dna也可以視為用a、c、g和t組成的字串,因此編輯距離也用在生物資訊學中,判斷二個dna的類似程度。
令 s1.substr(i)表示 s1前i個字元構成的子串,s2.substr(j)表示s2前j個字元構成的子串
dp[i][j]表示s1.substr(i)和s2.substr(j)的編輯距離。
注意,這句話的另一層含義是:當我們計算出了editdis(s1,s2)則預設了s1.substr(i)已經通過三種處理方式變成了s2.substr(j)。
所以,當我們計算dp[i+1][j+1]時,我們可以利用dp[i][j],dp[i+1][j],dp[i][j+1]的資訊。
1.確定最後一步:
令,s1的長度為len1,s2的長度為len2
dp[len1][len2]有三種方式可以實現,一種是s1.substr(len1-1)插入乙個字元使之等於s2(dp[len1][len2-1] + 1),一種是s2.substr(len2)刪除乙個字元使之等於s1(dp[len1-1][len2] + 1),另一種是替換最後乙個字元使s1和s2相等(dp[len1-1][len2-1] + 1)
2.確定轉移方程:
3.確定邊界和初始狀態
我們設定dp二維陣列大小是(len+1) * (len2+1),第0行代表 s1為空串,第0列代表s2為空串。
顯然,s1變成為空串需要的每次操作是dp[i][0]=i
s2變成為空船需要的每次操作是dp[0][j] = j
class
solution
:def
mindistance
(self, word1:
str, word2:
str)
->
int:
import numpy as np
len1, len2 =
len(word1)
,len
(word2)
dp =[[
0]*(len2+1)
for _ in
range
(len1+1)
]for i in
range(1
,len1+1)
: dp[i][0
]= i
for j in
range(1
,len2+1)
: dp[0]
[j]= j
for i in
range(1
,len1+1)
:for j in
range(1
,len2+1)
:if word1[i-1]
== word2[j-1]
: dp[i]
[j]= dp[i-1]
[j-1
]else
: dp[i]
[j]=
min(dp[i-1]
[j]+
1, dp[i]
[j-1]+
1, dp[i-1]
[j-1]+
1)return
int(dp[len1]
[len2]
)
編輯距離及編輯距離演算法
編輯距離概念描述 編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sitting g 俄...
編輯距離及編輯距離演算法
include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...
編輯距離及編輯距離演算法
include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...