傳送門
題目:給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。 你可以對乙個單詞進行如下三種操作:
1.插入乙個字元
2.刪除乙個字元
3.替換乙個字元
輸入:word1 = 「horse」, word2 = 「ros」 輸出:3
解釋:horse -> rorse (將 『h』 替換為 『r』)
rorse -> rose (刪除 『r』)
rose -> ros (刪除 『e』)
題目給定了兩個單詞,設為 a 和 b,這樣我們就能夠六種操作方法。
但我們可以發現,如果我們有單詞 a 和單詞 b:
對單詞 a 刪除乙個字元和對單詞 b 插入乙個字元是等價的。例如當單詞 a 為 doge,單詞 b 為 dog 時,我們既可以刪除單詞 a 的最後乙個字元 e,得到相同的 dog,也可以在單詞 b 末尾新增乙個字元 e,得到相同的 doge;
同理,對單詞 b 刪除乙個字元和對單詞 a 插入乙個字元也是等價的;
對單詞 a 替換乙個字元和對單詞 b 替換乙個字元是等價的。例如當單詞 a 為 bat,單詞 b 為 cat 時,我們修改單詞 a 的第乙個字母 b -> c,和修改單詞 b 的第乙個字母 c -> b 是等價的。
這樣以來,本質不同的操作實際上只有三種:
1.在單詞 a 中插入乙個字元;
2.在單詞 b 中插入乙個字元;
3.修改單詞 a 的乙個字元。
這樣以來,我們就可以把原問題轉化為規模較小的子問題。我們用 a = horse,b = ros 作為例子,來看一看是如何把這個問題轉化為規模較小的若干子問題的。
在單詞 a 中插入乙個字元:如果我們知道 horse 到 ro 的編輯距離為 a,那麼顯然 horse 到 ros 的編輯距離不會超過 a + 1。這是因為我們可以在 a 次操作後將 horse 和 ro 變為相同的字串,只需要額外的 1 次操作,在單詞 a 的末尾新增字元 s,就能在 a + 1 次操作後將 horse 和 ro 變為相同的字串;
那麼從 horse 變成 ros 的編輯距離應該為min(a + 1, b + 1, c + 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
dp[i-1][j-1]表示替換操作,dp[i-1][j]表示刪除(也可以看成插入)操作,dp[i][j-1]表示插入操作
public
intmindistance
(string word1, string word2)
}return dp[len1]
[len2]
;}
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 ...