Let's go further and introduce an edit distanceD[i][j]which is an edit distance between the firsticharacters ofword1and the firstjcharacters ofword2.
There is just one more character to add into one or both strings and the formula is quite obvious.
If the last character is the same,i.e.word1[i] = word2[j]then
D[i][j]=1+min(D[i−1][j],D[i][j−1],D[i−1][j−1]−1)
and if not, i.e. word1[i] != word2[j]we have to take into account the replacement of the last character during the conversion.
D[i][j]=1+min(D[i−1][j],D[i][j−1],D[i−1][j−1])
So each step of the computation would be done based on the previous computation, as follows:
一句话:相等看对角,不相等取左右对角的最小值+1
Code
class Solution {
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 0; i <= len1; i++) {
dp[i][0] = i;
}
for (int i = 0; i <= len2; i++) {
dp[0][i] = i;
}
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
//minus one cause from 1:len loop ahead one (can be seen form dp length)
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;//choose the smallest of three operations
}
}
return dp[len1][len2];
}
}
public int minDistance(String word1, String word2) {
// write your code here
int n = word1.length();
int m = word2.length();
int[] prev = new int[m+1];
for(int i = 0; i <= m; i++) {
prev[i] = i;
}
for(int i = 1; i <= n; i++) {
int[] current = new int[m+1];
current[0] = i;
for(int j = 1; j <= m; j++) {
if(word1.charAt(i-1)==word2.charAt(j-1)) {
current[j] = prev[j-1];
} else {
current[j] = Math.min(prev[j-1], Math.min(current[j-1], prev[j]))+1;
}
}
prev = current;
}
return prev[m];
}