代码随想录算法训练营 day 56: ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

55 阅读1分钟

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()];
    }
}