多维动态规划

编辑距离

中等#72Java时间 O(mn)空间 O(mn)

题目要做什么

将 word1 转换成 word2,每次可插入、删除或替换一个字符,求最少操作次数。

题目示例输入word1 = "horse", word2 = "ros"
题目示例输出3

01 为什么这样做

相同末尾字符无需操作。不同则比较删除、插入、替换三个前驱,加上本次操作。空前缀转换的代价是另一个前缀长度。

始终成立的条件

dp[i][j] 是 word1 前 i 个字符转换为 word2 前 j 个字符的最小代价。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int minDistance(String word1, String word2) {3        int m = word1.length(), n = word2.length();4        int[][] dp = new int[m + 1][n + 1];5        for (int i = 0; i <= m; i++) dp[i][0] = i;6        for (int j = 0; j <= n; j++) dp[0][j] = j;7        for (int i = 1; i <= m; i++) {8            for (int j = 1; j <= n; j++) {9                if (word1.charAt(i - 1) == word2.charAt(j - 1))10                    dp[i][j] = dp[i - 1][j - 1];11                else dp[i][j] = 1 + Math.min(dp[i - 1][j - 1],12                    Math.min(dp[i - 1][j], dp[i][j - 1]));13            }14        }15        return dp[m][n];16    }17}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索