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
二维DP问题:用distance[i][j] 表示 string1 的前 i 个数和 string 2 的前 j 个数的 Edit Distance。则有以下几种情况:
1. string1 的第 i 个字符与 string2 的第 j 个字符相同,则 distance[i][j] = distance[i-1][j-1]。
2. 如果不相同,则我们可以进行以下三种操作。假设string1的前i个字符为XA,string2的前i个字符为YB。
1) 操作1:Replace A with B。则我们有:distance[i][j] = distance[i-1][j-1] +1
2) 操作2:Delete A。则我们有:distance[i][j] = distance[i-1][j] +1
3) 操作3:Insert B。则我们有:distance[i][j] = distance[i][j-1] +1
选择以上三种操作的最优解,即 distance[i][j] = min(distance[i-1][j-1],distance[i-1][j],distance[i][j-1]) +1
class Solution {
public:
int minDistance(string word1, string word2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size1 = word1.size();
int size2 = word2.size();
vector<vector<int> > distance(size1+1,vector<int>(size2+1,0));
for(int i=0;i<=size2;i++)
{
distance[0][i] = i;
}
for(int i=0;i<=size1;i++)
{
distance[i][0] = i;
}
for(int i=1;i<=size1;i++)
{
for(int j=1;j<=size2;j++)
{
if(word1[i-1]==word2[j-1])
{
distance[i][j] = distance[i-1][j-1];
}
else
{
distance[i][j] = min(min(distance[i][j-1],distance[i-1][j]),distance[i-1][j-1]) + 1;
}
}
}
return distance[size1][size2];
}
};