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

news/2024/6/15 23:47:19 标签: 算法, leetcode, c++, 动态规划

文章目录

    • Leetcode 583. 两个字符串的删除操作
    • Leetcode 72. 编辑距离

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

题目链接:Leetcode 583. 两个字符串的删除操作
题目描述: 给定两个单词 word1word2 ,返回使得 word1word2 相同所需的最小步数。
每步可以删除任意一个字符串中的一个字符。

思路: 本题其实可以利用Leetcode 1143.最长公共子序列这道题的思路,求出最长公共子序列之后,剩下的字符都要被删除。(最小步数 = 字符串字符总和 - 2 * 最长公共子序列)
代码如下:(方法一)

class Solution {
public:
    int minDistance(string word1, string word2) {
        int n = word1.size(), m = word2.size();
        vector<vector<int>> dp(n + 5, vector<int>(m + 5));
        //求最长公共子序列的模板
        for(int i = 1; i <= n; i ++ )
            for(int j = 1; j <= m; 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]);
                }
            }
        //最小步数 = 字符串字符总和 - 2 * 最长公共子序列
        return n + m - 2 * dp[n][m];
    }
};
  • 时间复杂度: O ( n × m ) O(n × m) O(n×m)
  • 空间复杂度: O ( n × m ) O(n × m) O(n×m)

当然,本题也可以按照正常删除的思路来解决:
代码如下:(方法二)

class Solution {
public:
    int minDistance(string word1, string word2) {
        int n = word1.size(), m = word2.size();
        vector<vector<int>> dp(n + 5, vector<int>(m + 5));
        //初始化
        for(int i = 0; i <= n; i ++ ) dp[i][0] = i;
        for(int j = 0; j <= m; j ++ ) dp[0][j] = j;

        for(int i = 1; i <= n; i ++ )
            for(int j = 1; j <= m; 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] + 2, min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
                }
            }  
        return dp[n][m];
    }
};
  • 时间复杂度: O ( n × m ) O(n × m) O(n×m)
  • 空间复杂度: O ( n × m ) O(n × m) O(n×m)

Leetcode 72. 编辑距离

题目链接: Leetcode 72. 编辑距离
题目描述: 给你两个单词 word1word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

思路: 本题属于动态规划的经典问题。
代码如下:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int n = word1.size(), m = word2.size();
        vector<vector<int>> dp(n + 5, vector<int>(m + 5));
        //初始化
        for(int i = 0; i <= n; i ++) dp[i][0] = i;
        for(int j = 0; j <= m; j ++) dp[0][j] = j;
        for(int i = 1; i <= n; i ++ )
            for(int j = 1; j <= m; j ++ ){
                if(word1[i - 1] == word2[j - 1]){
                    dp[i][j] = dp[i - 1][j - 1];//不操作
                }else{//分别代表:word1字符串改,增,删一个字符
                    dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
                }
            }
        return dp[n][m];
    }
};
  • 时间复杂度: O ( n × m ) O(n × m) O(n×m)
  • 空间复杂度: O ( n × m ) O(n × m) O(n×m)

总结: 有了前面题目的铺垫,这两道题很轻松

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!


http://www.niftyadmin.cn/n/5423841.html

相关文章

Midjourney绘图欣赏系列(十)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

代码随想录刷题笔记-Day32

1. 最大子序和 53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/ 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组&#xff1a;是数组中的一个连续…

vite+vue3项目解决低版本兼容性问题(Safari白屏)

使用官方插件 vitejs/plugin-legacy 为打包后的文件提供传统浏览器兼容性支持。 1. 使用npm命令进行插件安装 npm add -D vitejs/plugin-legacy 2. 在 vite.config.js 配置文件中的 plugins 数组中引入它 // vite.config.js import legacy from vitejs/plugin-legacy impor…

安卓kotlin面试题 71-80

71. Kotlin中的@Metadata注解介绍以及生成流程 ?kotlin中的@Metadata注解是一个很特殊的注解,它记录了Kotlin代码中的一些信息,比如 class 的可见性,function 的返回值,参数类型,property 的 lateinit,nullable 的属性,typealias类型别名声明等。 我们都知道Kotlin代码…

2024字节跳动春招Java面试宝典:最全面!最详细!春招必备,99%的开发者都在收藏!

为了帮助准备春季招聘季的Java开发者更好地准备面试&#xff0c;本文汇总了一系列精心挑选的Java面试题。这些问题覆盖了从Java基础知识、集合框架、多线程和并发编程&#xff0c;到JVM、性能优化、Spring框架、设计模式、微服务、算法和数据结构、数据库、网络编程以及Java的新…

ReorderData - 优化阅读笔记

主要实现文件: bolt/lib/Passes/ReorderData.cpp 支持 X86/Arm 测试用例&#xff1a; bolt/test/reorder-data-writable-ptload.c int a1,a2,a3,a4; // 待补充默认关闭&#xff0c;开启选项&#xff1a; # 指定要重排的数据段 --reorder-data<section1,section2,section3…

JavaScript极速入门-综合案例(3)

综合案例 猜数字 预期效果 代码实现 <button type"button" id"reset">重新开始一局游戏</button><br>请输入要猜的数字:<input type"text" id"number"><button type"button" id"button&q…

面试题:你们的微服务系统是如何校验用户的,用户ID又是怎么传递的?+mybatisplus好处

你们的微服务系统是如何校验用户的&#xff0c;用户ID又是怎么传递的? 我们所有请求都是发送到网关中&#xff0c;然后再由网关发送到对应的微服务中&#xff0c; 但是在发送到微服务前&#xff0c;会有拦截器进行拦截&#xff0c;首先解析出当中的token 放到请求头中&…