您好,登錄后才能下訂單哦!
這篇文章主要介紹golang刷leetcode動態規劃之如何編輯距離,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少操作數 。
你可以對一個單詞進行如下三種操作:
插入一個字符
刪除一個字符
替換一個字符
示例 1:
輸入: word1 = "horse", word2 = "ros"輸出: 3解釋: horse -> rorse (將 'h' 替換為 'r')rorse -> rose (刪除 'r')rose -> ros (刪除 'e')
示例 2:
輸入: word1 = "intention", word2 = "execution"輸出: 5解釋: intention -> inention (刪除 't')inention -> enention (將 'i' 替換為 'e')enention -> exention (將 'n' 替換為 'x')exention -> exection (將 'n' 替換為 'c')exection -> execution (插入 'u')
解題思路:
編輯距離又稱levenshtein距離,用來衡量兩個字符串的相似度,假設倆字符串分別為word1和word2,用m[i][j]存word1[0:i],word2[0:j](左閉右開)的編輯距離,對于i,和j位置編輯距離m[i+1][j+1];
1,如果word1[i]==word2[j],則編輯距離是
A,m[i][j],word1[0:i],word2[0:j](左閉右開)的編輯距離
B,m[i][j+1]+1,word1[0:i],word2[0:j+1](左閉右開)的編輯距離
C,m[i+1][j]+1,word1[0:i+1],word2[0:j](左閉右開)的編輯距離
這3種情況下最小者
2,如果word1[i]!=word2[j],則編輯距離是
上述3個分支中,A替換為m[i][j]+1
3,由于m[i+1][j+1]用到了m[i][j+1],m[i+1][j],m[i][j],所以采用遞增循環。
4,初始條件,為了便于初始化,我們這里有個優化技巧:在word1和word2之前加一個空格,則:
A,m[0][0]=0
B,m[i][0]=i
C,m[0][j]=j
func minDistance(word1 string, word2 string) int {
if word1==""{
return len(word2)
}
if word2==""{
return len(word1)
}
m:=make([][]int,len(word1)+1)
for i:=0;i<len(word1)+1;i++{
m[i]=make([]int,len(word2)+1)
}
for i:=1;i<len(word1)+1;i++{
m[i][0]=i
}
for j:=1;j<len(word2)+1;j++{
m[0][j]=j
}
for i:=1;i<len(word1)+1;i++{
for j:=1;j<len(word2)+1;j++{
diff:=0
if word1[i-1]!=word2[j-1]{
diff=1
}
m[i][j]=min3(m[i-1][j]+1,m[i][j-1]+1,m[i-1][j-1]+diff)
}
}
return m[len(word1)][len(word2)]
}
func min3(a,b,c int)int{
if a<=b && a<=c{
return a
}
if b<=a&&b<=c{
return b
}
return c
}
以上是“golang刷leetcode動態規劃之如何編輯距離”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。