编辑距离问题的动态规划解法核心是定义dpi为将word1前i字符变为word2前j字符的最少操作数,初始化边界dp0=j、dpi=i,状态转移根据字符是否相等分别继承或取三种操作最小值加1,最终答案为dpm。

用动态规划解编辑距离问题,核心是把“两个字符串怎么变最少步”拆成一格一格填表的过程。关键不是背公式,而是理解每格 dp[i][j] 代表什么、为什么那样更新。
明确状态定义:dp[i][j] 表示前缀转换代价
定义 dp[i][j] 为:将 word1 的前 i 个字符 变成 word2 的前 j 个字符 所需的最少操作数。
注意:i 和 j 是长度(不是下标),所以 dp 数组大小为 (m+1) × (n+1),其中 m = word1.length(), n = word2.length()。
初始化边界:空串变非空串只有插入或删除
边界情况很直观:
- 当 word1 为空(i = 0),只能靠插入把 word2 的 j 个字符全加进来 → dp[0][j] = j
- 当 word2 为空(j = 0),只能靠删除把 word1 的 i 个字符全删掉 → dp[i][0] = i
状态转移:字符相同直接继承,不同就选三种操作里最省的
对每个位置 (i, j),看 word1[i−1] 和 word2[j−1](因为字符串下标从 0 开始):
立即学习“Java免费学习笔记(深入)”;
- 如果相等:不用操作,直接复用左上角结果 → dp[i][j] = dp[i−1][j−1]
- 如果不等:尝试三种操作,取最小值再加 1:
- 删除 word1[i−1] → 看 dp[i−1][j] + 1
- 插入 word2[j−1] → 看 dp[i][j−1] + 1
- 替换 word1[i−1] 为 word2[j−1] → 看 dp[i−1][j−1] + 1
代码实现要点:注意索引偏移和循环范围
Java 实现时注意三点:
- 数组声明为
int[][] dp = new int[m + 1][n + 1]; - 两层 for 循环都从 1 开始(i=1 到 m,j=1 到 n)
- 比较字符用
word1.charAt(i - 1) == word2.charAt(j - 1)
最终答案就是 dp[m][n],即整个字符串转换的最小代价。


















