Given two words word1 and word2, find the minimum number of operations
required to convert word1 to word2.You have the following 3 operations permitted on a word:
Insert a character Delete a character Replace a character Example 1:
Input: word1 = “horse”, word2 = “ros” Output: 3 Explanation: horse ->
rorse (replace ‘h’ with ‘r’) rorse -> rose (remove ‘r’) rose -> ros
(remove ‘e’) Example 2:Input: word1 = “intention”, word2 = “execution” Output: 5 Explanation:
intention -> inention (remove ‘t’) inention -> enention (replace ‘i’
with ‘e’) enention -> exention (replace ‘n’ with ‘x’) exention ->
exection (replace ‘n’ with ‘c’) exection -> execution (insert ‘u’)
dp问题,定义dp[i][j] 为从word1的前i个字符转化为word2的前j个字符,递推公式如下:
1.当word1.charAt(i) == word2.charAt(j)时,dp[i+1][j+1] =dp[i][j]
2.dp[i][j]=Math.min(Math.min(dp[i][j+1], dp[i+1][j]), dp[i][j]) +1;
重点在于dp数组的初始化,从0个字符转化为i个字符的编辑次数是i,从j个字符转化为0个字符的编辑次数是j
代码如下:
class Solution {
public int minDistance(String word1, String word2) {
//
int n1 = word1.length();
int n2 = word2.length();
if(n1 == 0) {
return n2;
}
if(n2 == 0) {
return n1;
}
int[][] dp = new int[n1 + 1][n2 + 1];
//dp[i][j] =
// word[i] == word[j]->dp[i][j] = dp[i-1][j-1];
//word[i] != word[j], dp[i][j]=min(dp[i-1][j], dp[i][j - 1], dp[i-1][j-1]) + 1 ;
// 关键在于数组的初始化,当从0个字符到i个字符时,编辑次数是i
for(int i = 0; i < n1 + 1; i++) {
dp[i][0] = i;
}
for(int j = 0; j < n2 + 1; j++) {
dp[0][j] = j;
}
for(int i = 0 ; i < n1; i++) {
for(int j = 0; j < n2; j++) {
if(word1.charAt(i) == word2.charAt(j)) {
dp[i + 1][j+ 1] = dp[i ][j ];
} else {
dp[i + 1][j+ 1] = Math.min(Math.min(dp[i][j+ 1], dp[i+ 1][j]), dp[i][j ]) +1;
}
}
}
return dp[n1][n2];
}
}