給定兩個單詞 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』)
解析:對於字串的問題,大部分可以使用動態規劃解決。
定義二維陣列dp[i+1][j+1],其中dp[i][j]代表對於word1的前i-1位與word2的前j-1位兩個子字串互相轉換所需的運算元。則問題變為求dp[i][j]
第一行,是 word1 為空變成 word2 最少步數,就是插入操作
第一列,是 word2 為空,需要的最少步數,就是刪除操作
如果word1[i]等於word2[j],即對應兩個字元相同,不需要進行操作,那麼這兩個子字串的編輯距離取決於去除最後乙個字元的子字串的操作距離。
dp[i][j]=dp[i-1][j-1]
如果兩個字元不同,即需要進行對應操作。可能進行的操作共有三種
對於插入操作,dp[i][j]=dp[i][j-1]+1
對於替換操作,dp[i][j]=dp[i-1][j-1]+1
對於刪除操作,dp[i][j]=dp[i-1][j]+1
這三種可能無法判別,因此選擇三種操作結果最小的。
因此得到狀態轉移方程
當 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];
當 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
class
solution
//輔助函式,求三個數中最小值
intminthree
(int a,
int b,
int c)
};
Leetcode 72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...
leetcode 72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3解釋 horse rorse 將 h 替換為 r r...
LeetCode72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r rorse rose 刪除 r rose ...