原题链接
这道题可以说是最长公共子序列问题的翻版,套用状态转换方程:
dp[i][j]表示子字符串word1[0,i),word2[0,j)的解
I、当word1[i-1]==word2[j-1]时,dp[i][j]=dp[i-1][j-1];
II、当word1[i-1] != word2[j-1]时,dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1。
时间复杂度是O(n^2),空间复杂度是O(n ^2)
可以优化一下,将空间复杂度降低为O(n)。
class Solution {
public:
int minDistance(string word1, string word2) {
//空间复杂度为O(n)
int m = word1.size(),n= word2.size();
vector<int> dp(n+1,0);
for(int i=1;i<=n;i++)
dp[i]=dp[i-1]+1;
for(int i=1;i<=m;i++){
int last = dp[0];
dp[0]+=1;
for(int j=1;j<=n;j++){
int now = dp[j];
dp[j]=word1[i-1]==word2[j-1]?last:min(dp[j],dp[j-1])+1;
last = now;
}
}
return dp[n];
/*
//空间复杂度为O(n^2)
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
for(int i=1;i<=n;i++)
dp[0][i]=dp[0][i-1]+1;
for(int i=1;i<=m;i++){
dp[i][0]=dp[i-1][0]+1;
for(int j=1;j<=n;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],dp[i][j-1])+1;
}
}
return dp[m][n];
return 0;*/
}
};