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

583.两个字符的删除操作

思路:返回两个字符相同的最少操作,两个字符都可以删减。定义dp数组,dpij表示返回以word1i-1结尾的单词和word2j-1结尾的单词 相同的最少操作数。递推公式,如果word1i-1==word2j-1, dpij = dpi-1j-1。否则,dpij可以由删除word1或者删除word2获得,min(dpi-1j+1,dpij-1+1).初始化。dpi0=i,dp0j=j.遍历顺序:从小到大。打印dp数组,用于debug。

cpp 复制代码
class Solution {
public:
    int minDistance(string word1, string word2) {
        //定义dp数组及其下标含义 dp[i][j]表示 以word1[i-1]结尾和以word2[j-1]结尾的单词,使他们相同的最小步数
        //递推公式 如果word1[i-1]==word2[j-1], dp[i][j]=dp[i-1][j-1]. else dp[i][j] = min(dp[i-1][j],dp[i][j-1]).
        //初始化 dp[i][0] = 1; dp[0][j] = 1;因为删一个就是空字符了
        //遍历顺序,从小到大。
        int size1 = word1.size();
        int size2 = word2.size();
        vector<vector<int>> dp(size1+1,vector<int>(size2+1,0));
        for(int i =1;i<=size1;i++)
        {
            dp[i][0] = i;
        }
        for(int j =1;j<=size2;j++)
        {
            dp[0][j] = j;
        }

        for(int i =1;i<=size1;i++)
        {
            for(int j =1;j<=size2;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);
                }
            }
        }
        return dp[size1][size2];
    }
};

72.编辑距离

思路:跟上道题一样,只不过在word1i-1和word2j-1不相同时,dpij可以被多种情况推出,可以由dpi-1j+1,dpij-1+1,相当于删减了一个字母,或者由dpi-1j-1+1推出,相当于变换了一个字母。

cpp 复制代码
class Solution {
public:
    int minDistance(string word1, string word2) {
        //dp数组及其下标的含义 dp[i][j]表示以word1[i-1]结尾的单词变成以word2[j-1]结尾的单词的最少操作数
        //递推公式 如果word1[i-1]==word2[j-1], dp[i][j] = dp[i-1][j-1];
        //否则有多种情况,1、替换一个字符 dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2);
        //初始化
        int size1 = word1.size();
        int size2 = word2.size();
        vector<vector<int>> dp(size1+1,vector<int>(size2+1,0));
        for(int i = 1;i<=size1;i++)
        {
            dp[i][0] = i;
        }
        for(int j =1;j<=size2;j++)
        {
            dp[0][j] = j;
        }
        for(int i =1;i<=size1;i++)
        {
            for(int j =1;j<=size2;j++)
            {
                if(word1[i-1]==word2[j-1])
                {
                    dp[i][j] = dp[i-1][j-1];
                }
                else
                {
                    dp[i][j] = min(min(dp[i-1][j],dp[i][j-1])+1,dp[i-1][j-1]+1);
                }
            }
        }
        return dp[size1][size2];
    }
};

收获:

编辑距离类问题,最好画出dp网格,确定初始化的含义及值,确定当i-1和j-1结尾的数组相等或不等时,dpij由几种情况推出。

相关推荐
明月_清风8 分钟前
多模式字符串匹配:Trie 与 AC 自动机
后端·算法
木井巳15 分钟前
【BFS/DFS 解决 FloodFill 算法】衣橱整理
java·算法·leetcode·深度优先·广度优先·宽度优先
热心网友俣先生19 分钟前
2026年高教社杯数模国赛A题:五年命题规律与预测
算法·机器学习·数学建模
LuminousCPP1 小时前
数据结构 - 排序(二):快速排序从错误初版到优化版|双指针划分 + 三数取中 + 小区间插入优化
c语言·数据结构·笔记·算法·排序算法
hansang_IR1 小时前
【题解】P9753 [CSP-S 2023] 消消乐
数据结构·c++·算法
shehuiyuelaiyuehao2 小时前
算法40,模拟运算,替换所有的问号
数据结构·算法·leetcode
用户204937554952 小时前
从“能识别”到“稳定识别”:离线ASR在真实会议场景中的问题与工程优化实践
算法
鹿角片ljp2 小时前
LeetCode 148:排序链表|归并排序、快慢指针找左中点与链表断开
算法
LabVIEW开发2 小时前
LabVIEW字符串特殊字符检测兼容
算法·labview·labview知识·labview功能·labview程序
晴天的雨.9923 小时前
[C++算法]快乐数
数据结构·c++·算法