编辑距离(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];
    }
};
目录
相关文章
|
1月前
Leetcode第五题(最长回文子串)
这篇文章介绍了解决LeetCode第五题“最长回文子串”问题的一种方法,使用了中心扩展法来寻找给定字符串中的最长回文子串。
34 0
|
6月前
leetcode-72:编辑距离
leetcode-72:编辑距离
50 0
|
1月前
acwing 902 最短编辑距离
acwing 902 最短编辑距离
11 1
|
3月前
|
算法
LeetCode第5题最长回文子串
该文章介绍了 LeetCode 第 5 题最长回文子串的解法,通过分析回文子串的特点,使用动态规划的思想,用二维数组记录字符串是否为回文串,从后往前遍历找子串,减少重复判断,最终找到最长回文子串,并总结了解题时通过举例推导找规律的思路。
LeetCode第5题最长回文子串
|
6月前
leetcode-5:最长回文子串
leetcode-5:最长回文子串
48 0
|
6月前
|
存储 算法 Go
LeetCode第五题: 最长回文子串
给定一个字符串 `s`​,找到 `s`​ 中最长的回文子串。你可以假设 `s`​ 的最大长度为 1000。
LeetCode第五题: 最长回文子串
|
6月前
|
算法
leetcode-461:汉明距离
leetcode-461:汉明距离
37 0
|
6月前
|
算法 C#
Leetcode算法系列| 5. 最长回文子串
Leetcode算法系列| 5. 最长回文子串
|
算法
LeetCode5-最长回文子串
LeetCode5-最长回文子串