【DP】編輯距離

peterzh6發表於2024-04-30

https://leetcode.cn/problems/edit-distance/description/?envType=study-plan-v2&envId=top-interview-150

非常難的一種考慮方式

【轉載】dp[i][j] 代表將 word1 的前 i 個字元轉換為 word2 的前 j 個字元所需的最少步數。
因此,根據題目給出的狀態轉移方程:
當 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] 表示替換操作,將 word1 的第 i 個字元替換為 word2 的第 j 個字元;
dp[i-1][j] 表示刪除操作,將 word1 的第 i 個字元刪除;
dp[i][j-1] 表示插入操作,將 word2 的第 j 個字元插入到 word1 的第 i 個字元之前。
舉個例子來說明,假設 word1 為 "horse",word2 為 "ros"。我們要求 dp[5][3],即將 word1 的前 5 個字元轉換為 word2 的前 3 個字元。
(1) dp[i-1][j-1]:先將 word1 的前 4 個字元 "hors" 轉換為 word2 的前 2 個字元 "ro",然後將第五個字元 word1[4](下標從 0 開始)由 'e' 替換為 's'(即替換為 word2 的第三個字元,word2[2])。
(2) dp[i][j-1]:先將 word1 的前 5 個字元 "horse" 轉換為 word2 的前 2 個字元 "ro",然後在末尾補充一個 's',即插入操作。
(3) dp[i-1][j]:先將 word1 的前 4 個字元 "hors" 轉換為 word2 的前 3 個字元 "ros",然後刪除 word1 的第 5 個字元。
以上三種操作中,選擇步數最小的運算元進行轉換,並加上當前操作的步數(即 +1),即可得到 dp[5][3] 的最小步數。

相關文章