力扣 编辑距离

多维动态规划,字符串操作。

题目

这题比较难理解,但理解了就好写了。看到字符串与动态规划的题,很大可能就是两个循环了,先把表画出来。然后想一下递推公式,可以插入、删除、替换操作,每进行一次操作就加一,注意看是word1转换为word2,所以操作的是word1,显然插入操作跟删除操作的dp是不同的,也有可能是刚好相对的。

假如字符不等word1[i-1] != word2[j-1],那么我们需要考虑三种编辑操作:替换时可以将 word1[i-1] 替换为 word2[j-1],这样两个字符串的最后一个字符就相同了,然后问题就转化为了将 word1 的前 i-1 个字符转换成 word2 的前 j-1 个字符,所以需要的操作数是 dp[i-1][j-1] + 1。插入时在 word1 中插入 word2[j-1],相当于将 word1 的前 i 个字符转换成 word2 的前 j-1 个字符后,再插入一个字符,因此需要的操作数是 dp[i][j-1] + 1。删除时从 word1 中删除 word1[i-1],这就把问题转化为将 word1 的前 i-1 个字符转换成 word2 的前 j 个字符,所需的操作数是 dp[i-1][j] + 1。由于要找的是最少编辑操作次数,dp[i][j] 应该取这三种情况中的最小值。

时间复杂度: O(mn),空间复杂度: O(mn)。

java 复制代码
class Solution {
    public int minDistance(String word1, String word2) {
        int n1 = word1.length();
        int n2 = word2.length();
        int[][] dp = new int[n1 + 1][n2 + 1];
        // 第一行
        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;

        for (int i = 1; i <= n1; i++) {
            for (int j = 1; j <= n2; 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 - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
            }
        }
        return dp[n1][n2];  
    }
}
相关推荐
TPBoreas1 小时前
Jenkins 改完端口号启动不起来了
java·开发语言
金斗潼关1 小时前
SpringCloud GateWay网关
java·spring cloud·gateway
JK0x071 小时前
代码随想录算法训练营 Day40 动态规划Ⅷ 股票问题
算法·动态规划
Feliz..1 小时前
关于离散化算法的看法与感悟
算法
水蓝烟雨2 小时前
1128. 等价多米诺骨牌对的数量
算法·hot 100
codists2 小时前
《算法导论(第4版)》阅读笔记:p11-p13
算法
秋名RG2 小时前
深入解析建造者模式(Builder Pattern)——以Java实现复杂对象构建的艺术
java·开发语言·建造者模式
eternal__day2 小时前
Spring Boot 实现验证码生成与校验:从零开始构建安全登录系统
java·spring boot·后端·安全·java-ee·学习方法
陈大爷(有低保)3 小时前
swagger3融入springboot
java
Kidddddult4 小时前
力扣刷题Day 43:矩阵置零(73)
算法·leetcode·力扣