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
动态规划问题,转化为填表,求两段字符串的最少操作次数等于,在word1[n],word[m-1]和word1[n-1], word[m]还有word1[n-1] word[m-1]的子问题中找到最小值,因此从少到多填表即可解决问题,下面代码空间使用O(n*m),而实际上,一行一行填表不需要再之前的记录,因此O(n)即可
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.length(),n = word2.length();
std::vector<std::vector<int> > dp(m+1,std::vector<int>(n+1,0));
for(int i=1; i<=m;i++){
dp[i][0] = i;
}
for(int i=1; i<=n;i++){
dp[0][i] = i;
}
for(int i=1;i<=m;i++){
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 - 1] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j] + 1));
}
}
return dp[m][n];
}
};