72.編輯距離
阿新 • • 發佈:2021-11-14
目錄
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];
}
}