代码随想录算法训练营第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离

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

视频讲解

主要思路:

(1)dp[ i ][ j ] 含义:使以i - 1为结尾的字符串word1与以j - 1为结尾的字符串word2要相同的最小步数

(2)递推公式:如果相同就不需要操作,与前一个操作数一致;如果不同就在同时删,删word1,删word2中挑一个最小的

(3)初始化:以i - 1为结尾的字符串word1要与空字符串相同则必须删i个字符,即操作i次,下面同理

代码实现:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int row = word1.size() + 1;
        int col = word2.size() + 1;
        vector> dp(row, vector(col, 0));   //dp[i][j]:使以i - 1为结尾的字符串word1与以j - 1为结尾的字符串word2要相同的最小步数
        for(int i = 1; i < row; i++) dp[i][0] = i;  //这样初始化是因为以i - 1为结尾的字符串word1要与空字符串相同则必须删i个字符,即操作i次,下面同理
        for(int j = 1; j < col; j++) dp[0][j] = j;
        dp[0][0] = 0;
        for(int i = 1; i < row; i++) {
            for(int j = 1; j < col; j++) {
            //递推公式是因为如果相同就不需要操作,与前一个操作数一致
                if(word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                }
            //如果不同就在同时删,删word1,删word2中挑一个最小的
                else {
                    dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2));  
                }
            }
        }
        return dp[row - 1][col - 1];
    }
};

72. 编辑距离

视频讲解

主要思路:

(1)dp[ i ][ j ] 含义:使以i - 1为结尾的字符串word1与以j - 1为结尾的字符串word2要相同的最小步数

(2)(2)递推公式:如果相同就不需要操作,与前一个操作数一致;如果不同就在同时增,删,替,

                      dp[i - 1][j] + 1是删字符串word1

                      dp[i][j - 1] + 1是删字符串word2

                      dp[i - 1][j - 1] + 1是替换字符串word1或word2里字符

                      之所以没考虑添加字符是因为实际上删字符串word1就相当于增加字符串

代码实现:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int row = word1.size() + 1;
        int col = word2.size() + 1;
        vector> dp(row, vector(col, col));
        for(int i = 1; i < row; i++) dp[i][0] = i;
        for(int j = 1; j < col; j++) dp[0][j] = j;
        dp[0][0] = 0;
        for(int i = 1; i < row; i++) {
            for(int j = 1; j < col; j++) {
                if(word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                }
                else {
                /*    dp[i - 1][j] + 1是删字符串word1
                      dp[i][j - 1] + 1是删字符串word2
                      dp[i - 1][j - 1] + 1是替换字符串word1或word2里字符
                      之所以没考虑添加字符是因为实际上删字符串word1就相当于增加字符串word2
                */   
                
                    dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));
                }
            }
        }
        return dp[row - 1][col - 1];
    }
};

你可能感兴趣的:(算法训练营,算法,动态规划,leetcode)