力扣 编辑距离

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

题目

这题比较难理解,但理解了就好写了。看到字符串与动态规划的题,很大可能就是两个循环了,先把表画出来。然后想一下递推公式,可以插入、删除、替换操作,每进行一次操作就加一,注意看是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];  
    }
}
相关推荐
wxr的理想之路3 分钟前
list链表的使用
c语言·数据结构·链表·list
湫qiu6 分钟前
手写 Protobuf —— Java 代码生成
java·go·protobuf
fqsword8 分钟前
C++ 算法竞赛STL以及常见模板
c++·算法
曦月逸霜14 分钟前
第五次CCF-CSP认证(含C++源码)
数据结构·c++·算法·ccf-csp
机器学习社区36 分钟前
QwQ-32B 开源!本地部署+微调教程来了
深度学习·算法·面试·大模型·面试题
Illusionna.42 分钟前
KMP 算法的 C 语言实现
c语言·数据结构·算法
dokii143 分钟前
leetcode454 四数相加
算法·哈希算法·散列表
郑州吴彦祖77243 分钟前
探索Java多线程的核心概念与实践技巧,带你从入门到精通!
java·多线程·线程安全
阿巴~阿巴~1 小时前
C/C++蓝桥杯算法真题打卡(Day3)
c语言·c++·算法·蓝桥杯
秋说1 小时前
【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法
java·开发语言·intellij-idea