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];
    }
}
(最近心态不好,一些测试题感觉戳中自己内心,也记录一下吧
 
 
 
 



















