583. Delete Operation for Two Strings
dp[i][j]为数组1的i-1下标前的子数组,变为数组2的j-1下标前子数组所需的最小步数。 递推公式为: word1[i] == word[j]时,dp[i][j] = dp[i-1][j-1] 不等时,要么从dp[i-1][j]转,需要一步操作 要么从dp[i][j-1]转,需要一步操作, 要么从dp[i-1][j-1]转,需要两步。
初始化方面,dp[i][0]初始化为i,dp[0][j]初始化为j dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
for(int i=1; i<word1.length()+1; i++) dp[i][0] = i;
for(int j=1; j<word2.length()+1; j++) dp[0][j] = j;
for(int i=1; i<word1.length()+1; i++) {
char c1 = word1.charAt(i-1);
for(int j=1; j<word2.length()+1; j++) {
char c2 = word2.charAt(j-1);
if(c1 == c2) {
dp[i][j] = dp[i-1][j-1];
}
else {
dp[i][j] = Math.min(dp[i-1][j-1] + 2, Math.min(dp[i-1][j]+1, dp[i][j-1]+1));
}
}
}
return dp[word1.length()][word2.length()];
}
}
72. Edit Distance 跟上一题差不多。转移公式也一样。在word1[i] == word[j]时,dp[i][j] = dp[i-1][j-1] 不等时,有三个方向,略有不同的是,从dp[i-1][j-1]推到dp[i][j]也是只需要一步。
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
for(int i=1; i<word1.length() + 1; i++) dp[i][0] = i;
for(int j=1; j<word2.length() + 1; j++) dp[0][j] = j;
for(int i=1; i<word1.length() + 1; i++) {
char c1 = word1.charAt(i-1);
for(int j=1; j<word2.length()+1; j++) {
char c2 = word2.charAt(j-1);
if(c1==c2) {
dp[i][j] = dp[i-1][j-1];
}
else {
dp[i][j] = Math.min(dp[i-1][j-1] + 1, Math.min(dp[i][j-1] + 1, dp[i-1][j]+1));
}
}
}
return dp[word1.length()][word2.length()];
}
}