【代码随想录刷题记录】 583. 两个字符串的删除操作 、 72. 编辑距离

583. 两个字符串的删除操作

1、题目
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

每步 可以删除任意一个字符串中的一个字符。

题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/

2、代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        //dp数组
        vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
        //遍历
        for(int i = 1; i <= word1.size(); i++){
            for(int j = 1; j <= word2.size(); j++){
                if(word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
                else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
     
        int result = word1.size() + word2.size() - 2 * dp[word1.size()][word2.size()];
        return result;

    }
};

3、小结
计算两个单词之间的最长公共子序列,最后将两个字符的长度分别减去最长公共子序列再相加就是最后答案。

72. 编辑距离

1、题目
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

题目链接:https://leetcode.cn/problems/edit-distance/

2、代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        //dp数组定义
        vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() +  1, 0));
        //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;
        //遍历递推
        for(int i = 1; i <= word1.size(); i++){
            for(int j = 1; j <= word2.size(); j++){
                //相等不需要做额外操作
                if(word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i -1][j - 1] ;
                else dp[i][j] = 1 + min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1]));
            }
        }
        return dp[word1.size()][word2.size()];


    }
};

3、小结
判断word1[i-1]与word2[j-1]是否相等,相等则根据递推公式得不需要再进行额外操作,不等则需要根据不同情况进行增删改得操作。本题的难点就在于递推公式的确定。

你可能感兴趣的:(leetcode)