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
d[i, j]=min{d[i-1, j ] + 1 , d[i , j-1] + 1 , d[i-1, j-1]+cost} (如果word1[i-1] == word2[j-1],则cost=0)
d[i-1, j] + 1, //delete,需要从word1里面删除一个才能相等,说明前i-1个与word2前j个相等
d[i, j-1] + 1, // insert,需要从word1里面增加一个才能相等,说明前i个与word2前j-1个相等
d[i-1, j-1] + cost // replace,需要替换才能相等,说明前i-1个与word2前j-1个相等
O(n^2) space:
int minDistance(string word1, string word2)
{
int len1 = word1.length();
int len2 = word2.length();
int dp[600][600];
memset(dp, 0, sizeof(dp));
for(int i = 0; i <= len1; i++)
dp[i][0] = i;
for(int j = 0; j <= len2; j++)
dp[0][j] = j;
for(int i = 1; i <=len1; i ++)
{
for(int j = 1; j <= len2; j ++)
{
if(word1[i-1] == word2[j-1])
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = min(min(dp[i-1][j]+1, dp[i-1][j-1]+1), dp[i][j-1]+1);
}
}
return dp[len1][len2];
}
O(n) space method 1 (利用两个数组保存当前列和前一列,因为矩阵其他部分没用到,所以可以节约空间):
int minDistance(string word1, string word2)
{
int len1 = word1.length();
int len2 = word2.length();
if(len1==0)
return len2;
if(len2==0)
return len1;
int current[600];//当前列
int last[600];//之前列
memset(current, 0, sizeof(current));
memset(last, 0, sizeof(last));
for (int i = 0; i <= len1; i++)
{
last[i] = i;
}
for (int j = 1; j <= len2; j ++)
{
for (int i = 1; i <= len1; i ++)
{
current[0] = j;
if (word1[i - 1] == word2[j - 1])
current[i] = last[i - 1];
else
current[i] = min(min(current[i - 1] + 1, last[i - 1] + 1), last[i] + 1);
}
memcpy(last, current, sizeof(current));
}
return current[len1];
}