1. 程式人生 > 其它 >72.編輯距離

72.編輯距離

目錄

72.編輯距離

題目

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

提示:

0 <= word1.length, word2.length <= 500
word1 和 word2 由小寫英文字母組成

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/edit-distance
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解

根據題目可以知道兩個資訊
1.將word1轉換為word2,那麼比較的基準應該是word2
2.可以進行三種操作,每種從處理得到的遞推式可能不同

題目是階段性決策,並且只問最優解,我們可以試試動態規劃。

dp陣列及其下標的含義
dp[i][j]:以i-1結尾的word1字串轉換成以j-1結尾的word2的字串所使用的最小運算元

dp陣列的遞推式

如果word1[i-1] == word2[j-1],說明這兩個元素相等,就不用再變了。dp[i][j] = dp[i-1][j-1]

如果word1[i-1] ≠ word2[j-1],說明當前元素是肯定需要操作的,具體是哪個操作呢?
假設word1="intb" word2="exe", 執行到b和最後的e比較時

  • 刪除處理:前面的int經過處理已經轉換成了exe,b刪除就行了,dp[i][j] = dp[i-1][j] + 1
  • 替換處理:前面的int經過處理轉換成ex,當前b替換成e就行了,dp[i][j]=dp[i-1][j-1] + 1
  • 增加處理:intb經過處理轉換成ex,進行增加e操作就行了,dp[i][j] = dp[i][j-1]+1

取最小值即可

dp陣列初始化
根據遞推式
dp[0][0] = 0;
dp[i][0] = i
dp[0][j] = j

遍歷順序
根據遞推式可以發現當前位置的值只與上面、左邊、左上有關

所以一定是從上到下,從左到右遍歷的

程式碼

class Solution {
    public int minDistance(String word1, String word2) {
       int len1 = word1.length();
       int len2 = word2.length();
       int dp [] [] = new int [len1+1] [len2+1];
       for(int i=0;i<=len1;i++){
           for(int j=0;j<=len2;j++){
               if(i==0){
                  dp[0][j] = j;
                  continue;
               } //初始化
               if(j==0){
                   dp[i][0] = i;
                   continue;
               } //初始化,當前位置的值只與上面、左邊、左上有關,所以初始化可以放進來寫
               if(word1.charAt(i-1)==word2.charAt(j-1)){
                   dp[i][j] = dp[i-1][j-1];
               }
               else{
                  dp[i][j] =Math.min(Math.min(dp[i-1][j] + 1,dp[i-1][j-1] + 1),dp[i][j-1]+1);
               }
           }
       }
       return dp[len1][len2];
    }
}