我写了两种方案的。一种是用的递归方式,结果超时了。一种是直接用数组模拟删、替换、插入操作。删操作对应的是DP[i][j-1],替换操作对应的是DP[i-1][j-1],插入操作对应额的是DP[i-1][j].此外要注意初始化的情形,如果word1是0,那么对应的最小步骤是word2的长度;如果word2是0,那么对应的最小步骤是word1的长度。OK。
解法一:超时的那种。。。。
class Solution {
public:
int minDistance(string word1, string word2) {
int ptr1,ptr2;
int a1,a2,a3;
ptr1 = ptr2 = 0;
int res1,res2;
res1=res2=0;
a1 = a2 = a3 = 0x9999;
if(word1.empty()&&word2.empty())return 0;
while((ptr1<word1.size()) && (ptr2<word2.size()) && (word1[ptr1]==word2[ptr2]))
{
res1++;
res2++;
ptr1++;
ptr2++;
}
if(ptr1==word1.size()&&ptr2==word2.size())return 0;
// cout<<ptr1<<" "<<ptr2<<endl;
//Del
if(ptr2!=word2.size())
{
//cout<<ptr1<<" "<<ptr2<<endl;
a1 = minDistance(word1.substr(ptr1,word1.size()-res1),word2.substr(ptr2+1,word2.size()-res2-1))+1;
}
// cout<<a1<<endl;
//rep
if(word1.size()&&ptr2!=word2.size())
{
//cout<<ptr1<<" "<<ptr2<<endl;
a2 = minDistance(word1.substr((ptr1<word1.size()?ptr1+1:ptr1),word1.size()-res1-1),word2.substr(ptr2+1,word2.size()-res2-1))+1;
}
// cout<<a2<<endl;
//ins
// cout<<res1<<" "<<res2<<endl;
// cout<<ptr1<<" "<<ptr2<<endl;
// cout<<(word1.substr(ptr1,word1.size()-res1-1)).size()<<endl;
if(word1.size())
a3 = minDistance(word1.substr((ptr1<word1.size()?ptr1+1:ptr1),word1.size()-res1-1),word2.substr(ptr2,word2.size()-res2))+1;
// cout<<a1<<" "<<a2<<" "<<a3<<endl;
return Min3(a1,a2,a3);
}
private:
int Min3(int a,int b,int c)
{
if(a<=b&&a<=c)return a;
else if(b<=a&&b<=c)return b;
return c;
}
};
解法二:(注意哈,C++ 自带的min、max可以是多个参数,自己可以不用写)
class Solution {
public:
int minDistance(string word1, string word2) {
if(word1.size()==0)return word2.size();
if(word2.size()==0)return word1.size();
int len1=word1.size(),len2=word2.size();
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] = Min3(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1;
}
return dp[len1][len2];
}
private:
int Min3(int a,int b,int c)
{
if(a<=b&&a<=c)return a;
else if(b<=a&&b<=c)return b;
return c;
}
};