Day56 动态规划 part16
583. 两个字符串的删除操作
我的思路:
感觉跟前两天子序列差不多,但是又有差别
这次是求删减最小次数,状态转移方程是比小
另外要注意初始化,
当i = 0时(word2为空),word1是j几个全删了(dp[0][j] = j)
同样的,当j = 0时(word1为空),word2是i几个全删了(dp[i][0] = i)
解答:
class Solution {
public int minDistance(String word1, String word2) {
int w1 = word1.length();
int w2 = word2.length();
int[][] dp = new int[w1 + 1][w2 + 1];
for(int i = 0; i <= w1; i++) {
dp[i][0] = i;
}
for(int j = 0; j <= w2; j++) {
dp[0][j] = j;
}
for(int i = 1; i <= w1; i++) {
for(int j = 1; j <= w2; j++) {
if(word1.charAt(i - 1) == word2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
}
else {
dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + 1;
}
}
}
return dp[w1][w2];
}
}
72. 编辑距离
我的思路:
word1改成word2
和上一题思路一致,初始化一模一样
需要特别注意的是,这道题是增or删or换,比较时需要考虑的情况多一些
解答:
class Solution {
public int minDistance(String word1, String word2) {
int w1 = word1.length();
int w2 = word2.length();
int[][] dp = new int[w1 + 1][w2 + 1];
for(int i = 0; i <= w1; i++) {
dp[i][0] = i;
}
for(int j = 0; j <= w2; j++) {
dp[0][j] = j;
}
for(int i = 1; i <= w1; i++) {
for(int j = 1; j <= w2; j++) {
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], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
}
}
return dp[w1][w2];
}
}
(最近心态不好,一些测试题感觉戳中自己内心,也记录一下吧