problem:
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
先考虑最简单的情况,当两个单词都只有一个字母时,上面的单词分别为“i”和“e”,此时有三种变换可以使用:
1.替换:把“i”变成“e”,或是把“e”变成“i”;
2.删除:把单词删除变成空串;
3.插入:把字母插入,比如将“e”插入空串变成“e”;
定义状态D(i,j),它表示从第1个字单词的第0位至第i位形成的子串和第2个单词的第0位至第j位形成的子串的编辑距离。
动态规划的初始距离为D(i,0)=i;D(0,j)=j;
动态规划的状态转移方程为:
D(i-1, j) + 1
D(i,j)=min ( D(i, j-1) + 1 )
D(i-1, j-1) +2( if X(i) != Y(j) ) ; D(i-1,j-1) ( if X(i) == Y(j) )
上面的状态转移方程的含义是,D(i,j)的值,要么是D(i-1, j)的操作完成之后删除一个字符(第1个单词的第i个字符),要么是D(i, j-1)的操作完成之后增加一个字符(第2个单词的第j个字符),要么是D(i-1, j-1)的操作完成自后替换一个字符(如果第1个单词的第i个字符和第2个单词的第j个字符不等),或者是D(i-1, j-1)的操作完成自后什么也不做(如果第1个单词的第i个字符和第2个单词的第j个字符相等)。
class Solution {
public:
int minDistance(string word1, string word2) {
int len1=(int)word1.length()+1;
int len2=(int)word2.length()+1;
vector<vector<int>> dis_matrix;
vector<int> tmp_vec;
for(int j=0;j<len2;j++)
tmp_vec.push_back(0);
for(int i=0;i<len1;i++)
dis_matrix.push_back(tmp_vec);
for(int i=0;i<len1;i++)
dis_matrix[i][0]=i;
for(int j=0;j<len2;j++)
dis_matrix[0][j]=j;
for(int i=1;i<len1;i++){
for(int j=1;j<len2;j++){
int tmp_step;
if( word1[i-1]==word2[j-1])//注意这里下标容易写错。一开始写成了if(word[i]==word2[j])
tmp_step=0+dis_matrix[i-1][j-1];
else
tmp_step=1+dis_matrix[i-1][j-1];
int tmp_step2=min((dis_matrix[i-1][j]+1),(dis_matrix[i][j-1]+1));
dis_matrix[i][j]=min(tmp_step2,tmp_step);
}
}
return dis_matrix[len1-1][len2-1];
}
};