编辑距离(LeetCode-72)

简介: 编辑距离(LeetCode-72)

编辑距离(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')


提示:


0 <= word1.length, word2.length <= 500

word1 和 word2 由小写英文字母组成


思路

五部曲


dp[i][j] 含义


将 i − 1 为结尾的字符串word1转换为 j − 1为结尾的字符串word2,最少操作数为 d p [ i ] [ j ]

递推公式

如果 w o r d 1 [ i − 1 ] = w o r d 2 [ j − 1 ]

不进行任何操作,值为 d p [ i − 1 ] [ j − 1 ]

如果二者不相等,有下述三种情况

首先要清楚word2添加一个元素,等价于word1删除一个元素!二者操作次数也均为一次!

操作一:word1删除一个元素,最少操作次数为 d p [ i − 1 ] [ j ] + 1

操作二:word2删除一个元素,最少操作次数为 d p [ i ] [ j − 1 ] + 1

操作三:word1替换一个元素,最少操作次数为 d p [ i − 1 ] [ j − 1 ] + 1 d

三者取最小值

数组初始化


dp[i][0] 明显等于 i

dp[0][j] 明显等于 j

遍历顺序


从前往后

测试用例



代码展示

class Solution
{
public:
    int minDistance(string word1, string word2)
    {
        int n1 = word1.size();
        int n2 = word2.size();
        vector<vector<int>> dp(n1 + 1, vector<int>(n2 + 1));
        for (int i = 1; i <= n1; i++)
        {
            dp[i][0] = i;
        }
        for (int j = 1; j <= n2; j++)
        {
            dp[0][j] = j;
        }
        for (int i = 1; i <= n1; i++)
        {
            for (int j = 1; j <= n2; 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, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1});
                }
            }
        }
        return dp[n1][n2];
    }
};
目录
相关文章
|
4月前
leetcode-72:编辑距离
leetcode-72:编辑距离
24 0
|
4月前
leetcode-5:最长回文子串
leetcode-5:最长回文子串
24 0
|
3月前
|
存储 算法 Go
LeetCode第五题: 最长回文子串
给定一个字符串 `s`​,找到 `s`​ 中最长的回文子串。你可以假设 `s`​ 的最大长度为 1000。
LeetCode第五题: 最长回文子串
|
4月前
|
存储 算法 C++
leetcode131分割回文串刷题打卡
leetcode131分割回文串刷题打卡
20 0
|
4月前
leetcode-647:回文子串
leetcode-647:回文子串
14 0
|
4月前
|
算法 C#
Leetcode算法系列| 5. 最长回文子串
Leetcode算法系列| 5. 最长回文子串
|
8月前
|
算法
LeetCode5-最长回文子串
LeetCode5-最长回文子串
|
9月前
|
算法
LeetCode-5 最长回文子串
LeetCode-5 最长回文子串
|
12月前
Leetcode 647 回文子串
Leetcode 647 回文子串
51 0