Edit Distance
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 charactertag: array, dynamic programming
教科书上着重介绍的内容,不不废话了。还是简单说下,这篇文章可能也会被初学者看到。
动态规划的基本思想,是从简单的初始条件出发,通过一些转移规则而逐渐解出复杂的情况。
这个问题里,我们需要维护一个编辑距离矩阵,里面记录着word1和word2的所有子串的编辑距离,包括本身。
需要注意的是,当word1[i] == word2[j]时,map[i][j] = map[i-1][j-1]。而不是map[i][j] = min (map[i-1][j-1], map[i-1][j], map[i][j-1])。一开始这里记错了。以及,注意处理空字符串。
C++:
class Solution {
public:
int minDistance(string word1, string word2) {
int length = word1.length() + 1;
int height = word2.length() + 1;
int map[height][length];
//handle empty string
if (word1.empty()){
return word2.length();
}
else if (word2.empty()){
return word1.length();
}
//initialize edit distance matrix
for (int i = 0; i < length; i++){
map[0][i] = i;
}
for(int i = 0; i < height; i++){
map[i][0] = i;
}
for(int i = 1; i < length; i++){
for(int j = 1; j < height; j++){
//same character
if (word1[i-1] == word2[j-1]){
map[j][i] = map[j-1][i-1];
}
else{
map[j][i] = min(map[j-1][i-1], min(map[j-1][i], map[j][i-1])) + 1;
}
}
}
return map[height-1][length-1];
}
};
