题目描述:给你两个单词
word1
和word2
, 请返回将word1
转换成word2
所使用的最少操作数 。你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1:
输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')示例 2:
输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u')提示:
0 <= word1.length, word2.length <= 500
word1
和word2
由小写英文字母组成
动规思路:
1.dp含义: dp[i][j]
表示将字符串 word1
的前 i
个字符转换成字符串 word2
的前 j
个字符所需的最小编辑距离
2.初始化:(dp
数组的第一行和第一列)
- 如果
i == 0
,说明word1
是空字符串,要将word2
的前j
个字符全部插入,所需的编辑距离就是j,
因此dp[0][j] = j
。 - 如果
j == 0
,说明word2
是空字符串,要将word1
的前i
个字符全部删除,所需的编辑距离就是i,
因此dp[i][0] = i
。
3.递推公式:
- 如果
word1[i-1] == word2[j-1]
说明两个字符相同,不需要编辑操作,dp[i][j] = dp[i-1][j-1]
。 - 如果
word1[i-1] != word2[j-1]
,说明需要进行编辑操作,有三种可能的操作:- 删除
word1
的第i
个字符,所需编辑距离为dp[i-1][j]
。 - 在
word2
的第j
个位置插入一个字符,所需编辑距离为dp[i][j-1]
。 - 替换
word1
的第i
个字符,所需编辑距离为dp[i-1][j-1]
。
- 删除
- 三种操作中,选取距离最小的那个,并加 1 赋值给
dp[i][j]
。
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
for (int i = 0; i <= word1.length(); i++) {
for (int j = 0; j <= word2.length(); j++) {
if (i == 0) {
dp[i][j] = j;
} else if (j == 0) {
dp[i][j] = i;
} else 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], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
}
}
return dp[word1.length()][word2.length()];
}
}