力扣 编辑距离

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

题目

这题比较难理解,但理解了就好写了。看到字符串与动态规划的题,很大可能就是两个循环了,先把表画出来。然后想一下递推公式,可以插入、删除、替换操作,每进行一次操作就加一,注意看是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];  
    }
}
相关推荐
foundbug99910 分钟前
Modbus协议C语言实现(易于移植版本)
java·c语言·前端
Luna-player11 分钟前
在前端中list.map的用法
前端·数据结构·list
听风吟丶13 分钟前
Java 反射机制深度解析:从原理到实战应用与性能优化
java·开发语言·性能优化
一缕猫毛14 分钟前
Flink demo代码
java·大数据·flink
小安同学iter20 分钟前
天机学堂-优惠券功能-day09(七)
java·spring cloud·微服务·jenkins·优惠券·天机学堂
it_czz22 分钟前
MCP调用流程图
java
历程里程碑28 分钟前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
爱学习的小可爱卢29 分钟前
JavaEE进阶——SpringBoot统一功能处理实战指南
java·spring boot·java-ee
小单于PRO1 小时前
Spring Boot 实现构建一个轻量级地图瓦片服务
java·spring boot·后端
Selegant1 小时前
Spring Boot 3 + Java 21 全新特性实战:虚拟线程、结构化并发与 Record 类型
java·spring boot·后端