Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
解析 动态规划
This is a classic problem of Dynamic Programming. We define the state dp[i][j] to be the
minimum number of operations to convert word1[0..i - 1] to word2[0..j
- 1]. The state equations have two cases: the boundary case and the general case. Note that in the above notations, both i and j take
values starting from 1.
For the boundary case, that is, to convert a string to an empty string, it is easy to see that the mininum number of operations to convert word1[0..i
- 1] to "" requires at least i operations
(deletions). In fact, the boundary case is simply:
dp[i][0] = i;dp[0][j] = j.
Now let's move on to the general case, that is, convert a non-empty word1[0..i - 1] to
another non-empty word2[0..j - 1]. Well, let's try to break this problem down into smaller
problems (sub-problems). Suppose we have already known how to convert word1[0..i - 2] to word2[0..j
- 2], which is dp[i - 1][j - 1]. Now let's consider word[i
- 1] and word2[j - 1]. If they are euqal, then no more operation is needed and dp[i][j]
= dp[i - 1][j - 1]. Well, what if they are not equal?
If they are not equal, we need to consider three cases:
- Replace
word1[i - 1]byword2[j - 1](dp[i][j] = dp[i - 1][j - 1] + 1 (for replacement)); - Delete
word1[i - 1]andword1[0..i - 2] = word2[0..j - 1](dp[i][j] = dp[i - 1][j] + 1 (for deletion)); - Insert
word2[j - 1]toword1[0..i - 1]andword1[0..i - 1] + word2[j - 1] = word2[0..j - 1](dp[i][j] = dp[i][j - 1] + 1 (for insertion)).
Make sure you understand the subtle differences between the equations for deletion and insertion. For deletion, we are actually converting word1[0..i
- 2] to word2[0..j - 1], which costs dp[i
- 1][j], and then deleting the word1[i - 1], which costs 1.
The case is similar for insertion.
Putting these together, we now have:
dp[i][0] = i;dp[0][j] = j;dp[i][j] = dp[i - 1][j - 1], ifword1[i - 1] = word2[j - 1];dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1), otherwise.
public class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = 1; i < m + 1; i++){
dp[i][0] = i;
}
for (int j = 1; j < n + 1; j++){
dp[0][j] = j;
}
for (int i = 1; i < m + 1; i++){
for (int j = 1; j < n + 1; j++){
if (word1.charAt(i - 1) == word2.charAt(j - 1)){
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j],dp[i][j - 1]));
}
}
}
return dp[m][n];
}
}

343

被折叠的 条评论
为什么被折叠?



