leetcode72 编辑距离

在这里插入图片描述
右下角的值即为最终要求的值
思路
动态规划

定义 dp[i][j]
21. dp[i][j] 代表 word1 中前 i 个字符,变换到 word2 中前 j 个字符,最短需要操作的次数
22. 需要考虑 word1 或 word2 一个字母都没有,即全增加/删除的情况,所以预留 dp[0][j] 和 dp[i][0]

状态转移
31. 增,dp[i][j] = dp[i][j - 1] + 1
32. 删,dp[i][j] = dp[i - 1][j] + 1
33. 改,dp[i][j] = dp[i - 1][j - 1] + 1
34. 按顺序计算,当计算 dp[i][j] 时,dp[i - 1][j] , dp[i][j - 1] , dp[i - 1][j - 1] 均已经确定了
35. 配合增删改这三种操作,需要对应的 dp 把操作次数加一,取三种的最小
36. 如果刚好这两个字母相同 word1[i - 1] = word2[j - 1] ,那么可以直接参考 dp[i - 1][j - 1] ,操作不用加一

作者:ikaruga
链接:https://leetcode-cn.com/problems/edit-distance/solution/edit-distance-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述
自底向下:

public static int minDistance(String word1,String word2){
        int n1 = word1.length();
        int n2 = word2.length();

        int[][] dp = new int[n1+1][n2+1];

       //初始化 如果i或j两者中其中一个为零,则对word1一直执行删除操作或一直执行插入操作,且此时不能使用该关系式
        for (int j = 1;j <= n2;j++){
            dp[0][j] = dp[0][j-1]+1;
        }
        for (int i = 1;i <= n1;i++){
            dp[i][0] = dp[i-1][0]+1;
        }

        //将从0-i的字符转换成0-j的字符
        for (int i = 1;i <= n1;i++){
            for (int j = 1;j <= n2;j++){
                //如果word1[i]和word2[j]相等,第i个字符对应下标是i-1;
                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-1],dp[i][j-1]),dp[i-1][j])+1;
                }
            }
        }
        return dp[n1][n2];
    }

原文链接

posted @ 2020-11-04 22:10  木有呂朋友  阅读(27)  评论(0)    收藏  举报