leetcode-72.编辑距离
字符串编辑类问题
题目详情
给你两个单词 word1
和 word2
, 请返回将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例1:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例2:
输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')
我的代码:
使用一个二维数组 dp[i][j]
,表示将第一个字符串到位置 i
为止,和第二个字符串到位置j
为止,最多需要几步编辑。当第 i
位和第j
位对应的字符相同时,dp[i][j]
等于 dp[i-1][j-1]
;当二者对应的字符不同时,修改
的消耗是 dp[i-1][j-1]+1
,插入 i 位置/删除 j 位置
的消耗是 dp[i][j-1] + 1
,插入 j 位置/删除 i 位置
的消耗是 dp[i-1][j] + 1
。
class Solution
{
public:
int minDistance(string word1, string word2)
{
int m = word1.length(), n = word2.length();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for (int i = 0; i <= m; ++i) //长度为i的word1
{
for (int j = 0; j <= n; ++j) //长度为j的word2
{
if (i == 0) //如果word1为空,则插入word2长度的char,操作数为j
dp[i][j] = j;
else if (j == 0) //word2为空,同理
dp[i][j] = i;
else //都不为空
{
dp[i][j] = min( //修改操作↓
dp[i-1][j-1] + ((word1[i-1] == word2[j-1])? 0: 1),//i-1位和j-1位相同则dp[i][j] = dp[i-1][j-1]否则加一
min(dp[i-1][j] + 1, dp[i][j-1] + 1));
//插入删除操作↑ 选出最小值
}
}
}
return dp[m][n];
}
};