题目描述
题目连接72. 编辑距离
题解
经典dp:
- dp数组定义:
dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]
。 - 初始化:dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2的最近编辑距离为dp[i][0]。所以直接初始化为非空串的长度即可
for (int i = 1; i <= c1.length; i++){ dp[i][0] = i; } for (int j = 1; j <= c2.length; j++){ dp[0][j] = j; }
- 递推公式:
if(word1[i - 1] == word2[j - 1]
: 此时word1新增加的一个字符,等于word2新增加的一个字符。那么就不需要做额外操作,所以dp[i][j] = dp[i - 1][j - 1];
- 当不相等时,dp[i][j]可以由三个地方推导而来,取其中最小的
* dp[i][j] = dp[i - 1][j] + 1 //在word2中新增加一个字符(或者可以看作在word1中删除最后一个字符)
* dp[i][j] = dp[i][j - 1] + 1 //在word1中新增加一个字符(或者可以看作在word2中删除最后一个字符)
* dp[i][j] = dp[i - 1][j - 1] + 1 //替换一个字符
所以递推公式为
if (c1[i - 1] == c2[j - 1]){ dp[i][j] = dp[i - 1][j - 1]; }else{ dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1; }
完整代码:
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length() + 1][word2.length() + 1];
char[] c1 = word1.toCharArray();
char[] c2 = word2.toCharArray();
for (int i = 1; i <= c1.length; i++){
dp[i][0] = i;
}
for (int j = 1; j <= c2.length; j++){
dp[0][j] = j;
}
for (int i = 1; i <= c1.length; i++){
for (int j = 1; j <= c2.length; j++){
if (c1[i - 1] == c2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
}
}
return dp[c1.length][c2.length];
}
}