力扣 编辑距离

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

题目

这题比较难理解,但理解了就好写了。看到字符串与动态规划的题,很大可能就是两个循环了,先把表画出来。然后想一下递推公式,可以插入、删除、替换操作,每进行一次操作就加一,注意看是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];  
    }
}
相关推荐
启山智软1 分钟前
【启山智软智能商城系统技术架构剖析】
java·前端·架构
一线大码2 分钟前
Java 使用国密算法实现数据加密传输
java·spring boot·后端
我命由我123458 分钟前
Android Gradle - Gradle 自定义插件(Build Script 自定义插件、buildSrc 自定义插件、独立项目自定义插件)
android·java·java-ee·kotlin·android studio·android-studio·android runtime
Riu_Peter11 分钟前
【技术】Maven 配置 settings.xml 轮询下载
xml·java·maven
天上路人13 分钟前
A-59F 多功能语音处理模组在本地会议系统扩音啸叫处理中的技术应用与性能分析
人工智能·神经网络·算法·硬件架构·音视频·语音识别·实时音视频
十六年开源服务商43 分钟前
2026年WordPress网站地图完整指南
java·前端·javascript
Edward111111111 小时前
3月17枚举
java·开发语言
yang_B6211 小时前
噪声处理方法
大数据·人工智能·算法
凡。。。2961 小时前
阿里云产品说明
java