力扣 编辑距离

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

题目

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

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

时间复杂度: 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];  
    }
}
相关推荐
NGINX开源社区几秒前
NGINX Ingress Controller 中的 Cache Policy:VirtualServer 实战指南
java·前端·nginx
CHHH_HHH5 分钟前
【C++】红黑树:比AVL树更实用的平衡二叉搜索树
开发语言·数据结构·c++·算法·stl
lld9510275 分钟前
(三)本地策略框架
java·服务器·数据库
SoftLipaRZC7 分钟前
C语言文件:文件操作完全指南
android·java·c语言
零陵上将军_xdr8 分钟前
API 签名防重放机制:基于 HMAC-SHA256 的设计与实现
java·学习·安全架构
ch.ju9 分钟前
Java程序设计(第3版)第四章——set-get方法
java·开发语言
lpd_lt10 分钟前
如何让AI生成项目的单元测试,propmt技巧详解
java·人工智能·单元测试·ai编程
Lazionr10 分钟前
基础算法 | 模拟算法练习
c++·算法
_日拱一卒16 分钟前
LeetCode:17电话号码的字母组合
java·数据结构·算法·leetcode·职场和发展
我是一颗柠檬18 分钟前
【Java项目技术亮点】Outbox事件驱动模式:解决分布式事务的终极方案
java·开发语言·分布式·后端·中间件·kafka