代码随想录Day59 | 583. 两个字符串的删除操作 72. 编辑距离

代码随想录Day59 | 583. 两个字符串的删除操作 72. 编辑距离

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

文档讲解:代码随想录

视频讲解: LeetCode:583.两个字符串的删除操作

状态

  1. dp数组
    dpij 表示 word1中的子串word10到word1i-1 和 word2中的子串word20到word2j-1相同时所需要的删除最少步数
  2. 递推公式
    当 word1i-1 == word2j-1 时 那么就说明该元素可以不用删除,dpij的结果就和dpi-1j-1的结果相同
    当不相等时,可能是删除word1i-1,可能是删除word2j-1,也可能两个都删除。
    删除word1i-1 dpij = dpi-1j+1
    删除word2j-1 dpij = dpij-1+1
    两个都删除 dpij = dpi-1j-1+2
    然后取三者的最小值
  3. 初始化
    当word1或者word2为空字符串时进行初始化
  4. 遍历顺序
    从前向后
  5. 打印dp
c++ 复制代码
//dp[i][j]表示s中0-i-1 与 t中0-j-1 进行删除操作后相同的最少步骤
//当s[i-1] == t[j-1] dp[i][j] = dp[i-1][j-1]
//当不相等时 就要考虑删除i-1 dp[i-1][j] 删除j-1 dp[i][j-1]的最小值+1
//以及同时删除i-1 和 j-1 dp[i-1][j-1]+2
//而 dp[i-1][j]+1 = dp[i-1][j-1]+2  相当于先删除i-1 然后在基础上再删除j-1
class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
        //初始化 当 s或者t的字符串长度为0时
        for(int i = 0;i<word1.size()+1;i++)
        {
            dp[i][0] = i;
        }
        for(int i = 0;i<word2.size()+1;i++)
        {
            dp[0][i] = i;
        }

        for(int i = 1;i<word1.size()+1;i++)
        {
            for(int j = 1;j<word2.size()+1;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],dp[i-1][j])+1;
                }
            }
        }

        return dp[word1.size()][word2.size()];
    }
};

72.编辑距离

文档讲解:代码随想录

视频讲解: 动态规划终极绝杀! LeetCode:72.编辑距离

状态

本题和上一题差不多,只是现在只能在一个字符穿上进行修改,我们考虑在字符串上的添加操作,比如在word1上添加一个word2的字符使得两个字符串相等,其实就是从word2上删除掉该字符就可以了,所以可以转换为上面一道题

  1. dp数组
    dpij 表示 word1中的子串word10到word1i-1 转换 word2中的子串word20到word2j-1,所需要的最少步数
  2. 递推公式
    当word1i-1 == word2j-1 那么说明不需要任何操作 dpij = dpi-1j-1
    当不相等时,有三种操作方式
    添加 相当于删除word2的j-1 dpij = dpij-1+1
    删除 删除word1的i-1 dpij = dpi-1j+1
    替换 相当于将word1的i-1 替换为 word2的j-1 dpij = dpi-1j-1+1
    取三者最小值
  3. 初始化
    当word1或者word2为空字符串时进行初始化
  4. 遍历顺序
    从前向后
  5. 打印dp
c++ 复制代码
//dp[i][j] 表示 s子串0-i-1 转换为 t子串0-j-1的最少操作数
//如果s[i-1] == t[j-1] 那么dp[i][j] = dp[i-1][j-1]
//如果不相等 就需要涉及到
//插入 在s的i-1位置插入t[j-1] dp[i][j-1]
//删除 删除s的i-1位置  dp[i-1][j]+1
//替换 直接替换s[i-1]为t[j-1] dp[i-1][j-1]+1
class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
        for(int i = 0;i<word1.size()+1;i++)
        {
            dp[i][0] = i;
        }
        for(int i = 0;i<word2.size()+1;i++)
        {
            dp[0][i] = i;
        }

        for(int i = 1;i<word1.size()+1;i++)
        {
            for(int j = 1;j<word2.size()+1;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],min(dp[i][j-1],dp[i-1][j]))+1;
                }
            }
        }

        return dp[word1.size()][word2.size()];
    }
};

<>

文档讲解:代码随想录

视频讲解: <>

状态

相关推荐
土司大王7 小时前
LeetCode hot100——对称二叉树
算法·leetcode·职场和发展
sali-tec8 小时前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
Navigator_Z8 小时前
LeetCode //C - 1208. Get Equal Substrings Within Budget
c语言·算法·leetcode
手写码匠8 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
黎阳之光8 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
大模型码小白9 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
sel_910 小时前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
Asize10 小时前
438. 找到字符串中所有字母异位词
算法
Asize10 小时前
283. 移动零
算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习