非科班菜鸡算法学习记录 | 代码随想录算法训练营第56天|| 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇

583. 两个字符串的删除操作
583. Delete Operation for Two Strings

知识点:动规
状态:看思路自己写
思路:

  dpij为到i-1和j-1为止的最小操作次数,需要初始化;

dp[i][0] 表示i-1要想变成和-1一样的删除次数,删除次数= i ;

递推公式:

当i-1 = j-1 时,不需要删,所以dp[i][j] = dp[i-1][j-1];

不等时三种情况:

dp[i][j] = min(dp[i][j-1]+ 1,min(dp[i-1][j]+1, dp[i-1][j-1] +2 ) );

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector>dp(word1.size()+1,vector(word2.size()+1, 0));
        // dpij为到i-1和j-1为止的最小操作次数
        for(int i = 0; i <=word1.size(); i++) dp[i][0] = i; 
        // dp[i][0] 表示i-1要想变成和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,min(dp[i-1][j]+1, dp[i-1][j-1] +2 ) );
                }
            }
        }
        return dp[word1.size()][word2.size()];
    }
};

非科班菜鸡算法学习记录 | 代码随想录算法训练营第56天|| 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇_第1张图片求最大字串,最后两个串的长度 -  2 * 最大字串长

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector>dp(word1.size()+1,vector(word2.size()+1, 0));
        // dpij为到i-1和j-1为止的最长相同字串数字


        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][j-1],dp[i-1][j] );
                }
            }
        }
        return (word1.size()+word2.size()) - 2*dp[word1.size()][word2.size()];
    }
};

72. 编辑距离
72. Edit Distance

知识点:动规
状态:不会
思路:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector>dp(word1.size()+1,vector(word2.size()+1, 0));
        // dpij为到i-1和j-1为止的最小操作次数
        for(int i = 0; i <=word1.size(); i++) dp[i][0] = i; 
        // dp[i][0] 表示i-1要想变成和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,min(dp[i-1][j]+1, dp[i-1][j-1] +1) );
                    dp[i][j] = min({dp[i][j-1]+ 1,dp[i-1][j]+1, dp[i-1][j-1] +1});
                    //增:dp[i][j-1]或者dp[i-1][j]
                    //删:删除一个等于另一个加一
                    //改:等于改成word1[i-1] == word2[j-1],所以dp[i][j] = dp[i-1][j-1] + 1;
                    //取这仨的最小值
                }
            }
        }
        return dp[word1.size()][word2.size()];
    }
};

非科班菜鸡算法学习记录 | 代码随想录算法训练营第56天|| 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇_第2张图片编辑距离总结篇   

代码随想录

你可能感兴趣的:(学习)