leetcode 72 編輯距離 動態規劃

2021-08-21 19:47:31 字數 1330 閱讀 1031

給定兩個單詞 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')

如果沒有替換,只是簡單的增加和刪除的話,那麼可以用乙個最長公共子串行去做,找到最長的公共字串,然後用len1+len2-2*公共子串行長度。

然而這裡有替換,有替換的話,情況就發生了變化,因為有時候替換乙個比的上新增或刪除兩個。

定義狀態:dp[i][j]:第乙個串的第i個位置與第二個串的第j個位置之前需要操作幾次達到相等。

之後,如果word1[i] = word2[j],如果相等的話,那麼就不用替換,也不要增刪,操作次數直接等於dp[i-1][j-1]。

如果不等於:那麼就有三種情況,一種是刪刪第乙個串乙個字元到狀態dp[i-1][j],第二中是刪第二個串乙個字元到dp[i][j-1],第三種是替換乙個字元使得兩個字元相等。這三種操作都只進行一次。

那麼轉移方程為:dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;

有乙個錯誤的認識就是,如果乙個長串和乙個短串比較,如果刪只能刪當前較長的串,這種認識是錯誤的,舉個例子:

sma和uism,對這種情況,顯然必須刪除短串的最後乙個字元,因為它礙著sm的匹配了。

class solution }}

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 ...