一.題目
給定兩個(gè)單詞 word1 和 word2,計(jì)算出將 word1 轉(zhuǎn)換成 word2 所使用的最少操作數(shù) 。
你可以對(duì)一個(gè)單詞進(jìn)行如下三種操作:
插入一個(gè)字符
刪除一個(gè)字符
替換一個(gè)字符
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/edit-distance
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
二.解體思路
這一道題讀完之后感覺(jué)很復(fù)雜,完全不知道怎么入手。如果從動(dòng)態(tài)規(guī)劃的角度考慮。我們看到這個(gè)題目中有兩個(gè)字符串,想到是不是可以用一個(gè)二維數(shù)組作為dp。dp的長(zhǎng)和寬就是兩個(gè)字符串的長(zhǎng)度。那么dp[i][j]表達(dá)什么含義呢?因?yàn)橐蟮氖莣ord1轉(zhuǎn)換為word2的步驟。那么它的子問(wèn)題可以為word1的前i個(gè)字符轉(zhuǎn)換為word2的前j個(gè)字符。這也就是dp[i][j]的含義。
定義出問(wèn)題來(lái),之后就是找遞推公式和初始化了。
先考慮遞推公式。一般來(lái)說(shuō)dp[i][j]經(jīng)常由dp[i - 1][j - 1]、dp[i - 1][j]和dp[i][j - 1]來(lái)推導(dǎo)出來(lái)。對(duì)于這道題適不適用呢?答案是肯定的。可以按word1[i]是否和word2[j]相等來(lái)分為兩種情況討論。
總結(jié):這一題屬于用二維數(shù)組作為dp數(shù)組的題目。關(guān)鍵是dp[i][j]可以用d[i-1][j-1]等可以推導(dǎo)出來(lái)。題目為變量1的前i個(gè)字符轉(zhuǎn)換為變量2的前j個(gè)字符。與這一題類似的還有
三.AC代碼
class Solution {
public int minDistance(String word1, String word2) {
int n = word1.length(),m = word2.length();
int[][] dp = new int[n + 1][m + 1];
dp[0][0] = 0;
for(int i = 1; i <= n; i++) {
dp[i][0] = i;
}
for(int j = 1; j <= m; j++) {
dp[0][j] = j;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(word1.charAt(i - 1) == word2.charAt(j - 1)) {
dp[i][j] = 1 + Math.min(Math.min(dp[i - 1][j],dp[i][j - 1]),dp[i - 1][j - 1] - 1);
} else {
dp[i][j] = 1 + Math.min(Math.min(dp[i - 1][j],dp[i][j - 1]),dp[i - 1][j - 1]);
}
}
}
return dp[n][m];
}
}