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
WORD2(j) | C | A | T | |
WORD1 (i) | 0 | 1 | 2 | 3 |
S | 1 | 1 | 2 | 3 |
I | 2 | 2 | 2 | 3 |
T | 3 | 3 | 3 | 3 |
word1的每个字母为i, word2的字母为j。从word1变到word2,如果word1[i] == word2[j]那么当前edit distance为d[i-1][j-1]。如果不相等,那么就是或者是前d[i-1][j-1]的distance+1,或者是word1 插入一个字母:d[i-1][j] 或者是word2插入一个字母d[i][j-1]三者中的最小distance:min(d[i-1][j-1], d[i-1][j], d[i][j-1])+1。为了节省空间,只用两个一维数组。
public int minDistance(String word1, String word2) {
int[] res = new int[word1.length()+1];
for (int i = 0; i < word1.length()+1; i++) {
res[i] = i;
}
for(int j = 0; j < word2.length(); j++) {
int[] newRes = new int[word1.length()+1];
newRes[0] = j+1; <span style="color:#ff0000;">//注意设初值</span>
for (int i = 0; i < word1.length(); i++) {
if (word1.charAt(i) == word2.charAt(j)) {
newRes[i+1] = res[i];
} else {
newRes[i+1] = Math.min(res[i], Math.min(newRes[i], res[i+1])) + 1; <span style="color:#ff0000;">//Math.min 不提供3个parameter</span>
}
}
res = newRes;
}
return res[word1.length()];
}