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[i][j] 表示word1[1...i] 与 word2[1...j]的最短编辑距离,
当word1[i]与word2[j]相等时,则不需要编辑:
dp[i][j] = dp[i-1][j-1]
当word1[i]与word2[j]不相等时,则需要编辑,编辑有三种情况:
a) 在word1[1...i]后增加一个字符,等较于在word2[1...i]后删除一个字符: dp[i][j-1]+1
b) 在word1[1...i]删除一个字符: dp[i-1][j]+1
c) 将word1[i]替换掉: dp[i-1][j-1]+1
class Solution {
public:
int min(int a,int b,int c){
if(b<a)
a = b;
if(c<a)
a = c;
return a;
}
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 **dp = new int*[len1+1];
for(int i = 0; i <= len1; i++)
dp[i] = new int[len2+1];
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(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1);
}
}
}
int result = dp[len1][len2];
for(int i = 0; i <= len1; i++)
delete [] dp[i];
delete [] dp;
return result;
}
};