72. 编辑距离
class Solution {
public:
int minDistance(string word1, string word2) {
int word1Length = word1.length(), word2Length = word2.length();
// dp[i][j]表示word1[0 ... i]转换成word2[0 ... j]需要的最少步数
// 针对第一行,第一列要单独考虑,所以多引入一行一列
vector<vector<int>> dp(word1Length+1, vector<int>(word2Length+1, 0));
// 1.base状态初始:
// (1)第一行::是 word1 为空,变成 word2 最少步数,就是插入操作
for(int j = 1; j <= word2Length; j++){
dp[0][j] = dp[0][j - 1] + 1;
}
// (2)第一列:是 word2 为空,需要的最少步数,就是删除操作
for(int i = 1; i <= word1Length; i++){
dp[i][0] = dp[i - 1][0] + 1;
}
// 2. 状态转移:
// (1)当 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];
// (2)当 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
// 其中,dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。
for(int i = 1; i <= word1Length; i++){
for(int j = 1; j <= word2Length; j++){
if(word1[i - 1] == word2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}
else{
dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + 1;
}
}
}
return dp[word1Length][word2Length];
}
};