代码训练营第58天:动态规划part16|leetcode583两个字符串的删除操作|leetcode72编辑距离。

leetcode583:两个字符串的删除操作

文章讲解:leetcode583

leetcode72:编辑距离

文章讲解:leetcode72

目录

1,leetcode583 两个字符串的删除操作:

2,leetcode72 编辑距离:


1,leetcode583 两个字符串的删除操作:

做题做到现在发现往往是题目的要求就是dp的含义。不用想的太复杂。两个字符串,这是一个二维dp。dp[i][j]的含义是字符串a到i,字符串b到j为止,需要删除的最少操作。那无非是两种,若i与j相同,就是dp[i][j]=dp[i-1][j-1],如果不同的,那就删i:dp[i-1][j]+1, 删j:dp[i][j-1], 或者i,j 都删掉:dp[i-1][j-1]+2,这三个取最小即可。注意前天的题目,从1开始遍历,初始化很方便。

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector> dp(word1.size()+1, vector(word2.size()+1, 0));
        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] = min(dp[i][j-1]+1, dp[i-1][j]+1);
                    dp[i][j] = min(dp[i][j], dp[i-1][j-1]+2);
                }
            }
        }
        return dp[word1.size()][word2.size()];
    }  
};

做麻烦了,其实只要找到最长公共子序列,把子序列意外的字符全部删去就是最少的删除次数:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector> dp(word1.size()+1, vector(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]);
            }
        }
        return word1.size()+word2.size()-dp[word1.size()][word2.size()]*2;
    }
};

2,leetcode72 编辑距离:

我的想法是,和上面那道题一样的,如果字母相同,就不用改,如果字母不同,就删一个dp[i-1][j]+1,增加一个dp[i][j-1]+1,或者换一个dp[i-1][j-1]+1

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector> dp(word1.size() + 1, vector(word2.size() + 1, 0));
        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] = min(dp[i-1][j]+1,dp[i][j-1]+1);
                    dp[i][j] = min(dp[i][j],dp[i-1][j-1]+1);
                }
            }
        }
        return dp[word1.size()][word2.size()];
    }
};

拿下。

你可能感兴趣的:(算法)