感觉这题不是按难度划分的而是按代码长度划分的…看了答案才知道怎么做,其实思路很简单,但是特别难想……
意思是使用动态规划,依次计算由word1的前i个字母到word2的前j个字母要经历的最小变化数。
min D[i][j]=min(D[i-1][j]+1,D[i][j-1]+1,D[i-1][j-1]+1)(当word1第i个字母和word2第j个字母不同时,从word1的前i-1个字母到word2的前j-1个字母比从word1的前i个字母到word2的前j个字母需要多变最后一个字母)
min D[i][j]=min(D[i-1][j]+1,D[i][j-1]+1,D[i-1][j-1]+0)(当word1第i个字母和word2第j个字母相同时,不需要变最后一个字母)
根据这个思路就可以写出代码。
class Solution {
public:
int minDistance(string word1, string word2) {
int n=word1.size();
int m=word2.size();
int D[n+1][m+1];
for(int i=0;i<=n;i++) D[i][0]=i;
for(int i=0;i<=m;i++) D[0][i]=i;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
D[i][j]=min(D[i-1][j]+1,D[i][j-1]+1);
int dd=(word1[i-1]!=word2[j-1])?1:0;
D[i][j]=min(D[i][j],D[i-1][j-1]+dd);
}
}
return D[n][m];
}
};