LeetCode 72.编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符 删除一个字符 替换一个字符
dp数组定义:
dp[i][j] : 以下标i-1为结尾的字符串word1和以下标j-1为结尾的字符串word2,最少操作数为dp[i][j]
确定递推公式:
// 递归公式
if (word1[i - 1] == word2[j - 1])
不操作
if (word1[i - 1] != word2[j - 1])
增
删
换
// 递归公式代码
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], dp[i - 1][j], dp[i][j - 1]}) + 1;
}
dp初始化:
for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
dp数组变化过程:
| word 2 | r | o | s |
---|
word 1 | 0 | 1 | 2 | 3 | h | 1 | 1 | 2 | 3 | o | 2 | 2 | 1 | 2 | r | 3 | 2 | 2 | 2 | s | 4 | 3 | 3 | 2 | e | 5 | 4 | 4 | 3 |
完整代码:
class Solution {
public:
int minDistance(string word1, string word2) {
int m=word1.size(), n=word2.size();
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
// 初始化dp数组
for(int i=0;i<=m;i++)
dp[i][0] = i;
for(int j=0;j<=n;j++)
dp[0][j] = j;
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],dp[i][j-1],dp[i-1][j-1]}) + 1; // min内参数超2个,使用{};
}
}
}
return dp[m][n];
}
};
|