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];
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix