LeetCode72 編輯距離

2021-10-07 18:41:59 字數 2252 閱讀 8928

考慮用乙個二維dp陣列表示所需的最小操作次數。

dp[i][j]表示將word1的前i個字元轉換為word2的前j個字元所需要的最少操作次數。

由於操作的順序對於最後操作的結果沒有影響,所以我們假設操作總是從word1的前面字元操作到word1的後面字元。

如果word1的第i個字元等於word2的第j個字元,所以對於第i個字元實際上是沒有操作的,

那麼編輯距離就取決於word1的1 ~ i - 1的字元和word2的1 ~ j - 1的字元,

所以我們得到:dp[i][j] = dp[i - 1][j - 1]

這個方程表示當word1的第i個字元等於word2的第j個字元,編輯距離就是將word1的1~i-1個字元改為

word2的1~j-1的編輯距離。 (至於是怎麼編輯的,我們不需要管,我們只需要計算編輯距離就行了,下面同理)

如果word1的第i個字元和word2的第j個字元不相等。那麼有三種操作:

(1)如果要將word1的 1 ~ i 轉換為word2的 1 ~ j 的最後一步是:在word1的1 ~ i個字元之後增加乙個字元word1[i + 1] (這個字元必然是word2[j]),這就比將word1的1i轉換為word2的1j-1的編輯距離多一(這裡可能有點難以理解,這麼說吧,word1最開始是1i,word2是1j-1,由於word1轉換為word2的最後一步是加入乙個字元word1[i + 1]或者說是word2[j],所以編輯距離就是word1的1i到word2的1j-1的編輯距離加一!) 得到狀態轉移方程: 編輯距離dp[i][j] = dp[i][j - 1] + 1

(2) 如果要將word1的1 ~ i 轉換為word2的 1 ~ j的最後一步是: 刪掉word1的第i個字元,那麼編輯距離就是將word1的1~i-1個字元轉換為word2的1~j個字元的編輯距離加一(加一這部操作表示刪除word1[i]), 因此我們得到狀態轉移方程:dp[i][j] = dp[i - 1][j] + 1

(3) 如果要將word1的1 ~ i 轉換為word2的 1 ~ j的最後一步是: 修改word1的第i個字元,那麼編輯距離就是將word1的1i-1個字元轉換為word2的1j-1個字元的編輯距離加一。可以這麼理解:經過將word1的1i-1個字元轉換為word2的1j-1個字元的編輯距離之後,word2多了乙個字元word[j],偏偏word1的最後乙個字元word[i]和word2[j]不相等,好在我們只需要一步修改操作就可以完成所有轉換。 所以狀態轉移方程是:dp[i][j] = dp[i - 1][j - 1] + 1

有了狀態轉移方程,只需要再對dp陣列的邊界做初始化,然後就可以開始遞推啦。

邊界可以這麼確定:假設word1和word2兩個字串其中乙個字串為空,另乙個字串長度為x,那麼dp[x][0]或者dp[0][x]顯然就是x了。

把長度為x的字串全部刪掉也好,把空字串加x個字元使得它和另乙個字串相等也好,最少的操作次數必然是x。

這樣我們就找到了陣列遞推邊界,開始考慮遞推:

從上面的第2點(word1的第i個字元不等於word2的第j個字元)的分析可以發現,dp[i][j]是從dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]

三個狀態得到的,而且都是在前乙個狀態的基礎上加一(分別表示新增、刪除、修改操作),由於我們的dp陣列表示操作的最少次數,

所以我們要取三個前置狀態的最小值再+1。

因此當word1的第i個字元不等於word2的第j個字元時,我們得到狀態轉移方程:dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j]) + 1

如果當word1的第i個字元和word2的第j個字元相等呢,這個情況我們可以單獨判斷,如果相等,就讓dp[i][j]等於dp[i - 1][j - 1]就好了。

**如下:

class solution 

for(int i = 1; i <= m; ++i)

for(int i = 1; i <= n; ++i) }}

return dp.back().back(); //等價於return dp[n][m]; }};

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