leetcode刷题详解十一

news2025/1/17 0:56:37
⭕️583. 两个字符串的删除操作
  • 思路:核心代码就是最长公共子序列,但是需要注意的是结果

    就是如果说公共子序列为0,则需要两个字符串长度的才行

    如果有,就是 n + m ∗ 2 d p [ n ] [ m ] n+m*2dp[n][m] n+m2dp[n][m]

int minDistance(string word1, string word2) {
    int n = word1.size();
    int m = word2.size();
    vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
    for(int i = 1; i < n + 1; i++){
        for(int j = 1; j < m + 1; j++){
            if(word1[i - 1] == word2[j - 1]){
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }else{
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    return n+m-2*dp[n][m];
}
712. 两个字符串的最小ASCII删除和

本质上换汤不换药~参考前面的公共子序列问题。

int minimumDeleteSum(string s1, string s2) {
        int n = s1.size();
        int m = s2.size();
        vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
        int ascii_count = 0;
        for(int i = 0; i < n; i++){
            ascii_count += s1[i];
        }
        for(int i = 0; i < m; i++){
            ascii_count += s2[i];
        }
        for(int i = 1; i < n + 1; i++){
            for(int j = 1; j < m+1; j++){
                if(s1[i-1] == s2[j-1]){
                    dp[i][j] = dp[i-1][j-1] + (int)s1[i-1];
                }else{
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }
        if(dp[n][m] == 0){
            return ascii_count;
        }
        return  ascii_count-2*dp[n][m];         
    }
1035. 不相交的线
  • 思路:本质就是求最长公共子序列!!!!!!

    因为这道题两个连线不想交,你想想,如果不想交,不就是公共子序列,按顺序找吗???

    leetcode真的恶心

int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();
        vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
        for(int i = 1; i < n + 1; i++){
            for(int j = 1; j < m + 1; j++){
                if(nums1[i - 1] == nums2[j - 1]){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[n][m];
    }
392. 判断子序列
  • 思路:这道题很简单,但是道题给了另一个不简单的方向,即要匹配的字符串就数十亿个,如何考虑?

  • 简单的:

    脑瘫写法:

    bool isSubsequence(string s, string t) {
            int n = s.size();
            int m = t.size();
            if(n == 0){
                return true;
            }
            int temp = 0;
            for(int i = 0; i < m; i++){
                if(s[temp] == t[i]){
                    temp++;
                    if(temp == n){
                        return true;
                    }
                }
            }
            return false;
        }
    

    双指针:

    bool isSubsequence(string s, string t) {
            int i = 0;
            int j = 0;
            int n = s.size();
            int m = t.size();
            while(i < n && j < m){
                if(s[i] == t[j]){
                    i++;
                }
                j++;
            }
            return i == n;
        }
    
  • 进阶数十亿的:

    如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10 亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

    空间换时间的思想。关键点是:利用一个二维数组记录每个位置的下一个要匹配的字符的位置,这里的字符是'a' ~ 'z',所以这个数组的大小是 dp[n][26],n 为 T 的长度。那么每处理一个子串只需要扫描一遍 S 即可,因为在数组的帮助下我们对 T 是“跳跃”扫描的。

    如下图一,很自然的,当T索引为0时候,对应的第0列就是当前字符在T中出现位置的下标,没有的标-1就行;

    451f324be3121d731c1bd49ae62db5d
    /*ahbgdc这个T字符串构成的数组如下:重点在于从后往前构造会简单很多*/
    1 -1 -1 -1 -1 -1 -1 
    3 3 3 -1 -1 -1 -1 
    6 6 6 6 6 6 -1 
    5 5 5 5 5 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    4 4 4 4 -1 -1 -1 
    2 2 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    

    这个图应该能说明思想,其实就是跳表的思想,只要有-1就不比了,不用完全遍历t,时间换空间的思想。

    bool isSubsequence(string s, string t) {
        t.insert(0, ' ');
        int len = t.size();
        vector<vector<int>> vec(len, vector<int>(26, 0));
        //创建一个二维数组
    
        for(char char_t= 'a'; char_t <= 'z'; char_t++){
            int next_pos = -1;//这个要放在循环里面!不能放在外面!
            for(int i = len-1; i >=0 ;i--){
                vec[i][char_t-'a'] = next_pos;
                if(t[i] == char_t){
                    next_pos = i;
                }
            }
        }
        //开始匹配
        int index = 0;
        for(char c : s){
            index = vec[index][c - 'a'];
            if(index == -1){
                return false;
            }
        }
        return true;
    }
    
115. 不同的子序列
  • 思路:

    说句题外话,就是两个字符串或者数字比较的话,大概率不是dp就是双指针,dp的话ij表示s1的前i个和s2的前j个

    同时,子序列或者字串的话,切记,空串是任何序列的子序列!

    因此这道题也很常规,但是难点就在于状态转移方程不好想

    首先给出状态转移方程:

    if (s[i - 1] == t[j - 1]) {
          dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
        } else {
           dp[i][j] = dp[i - 1][j];
        }
    

    状态转移方程为啥是上述的?只有一个办法,就是画表。以后看到子序列问题的dp ,画表就完事儿了!!!!

    image-20220501220905568
    int numDistinct(string s, string t) {
            int n = s.size();
            int m = t.size();
            if(n < m){
                return 0;
            }
            vector<vector<long long>> dp(n+1, vector<long long>(m+1, 0));
            //切记!空字符串匹配为1
            for(int i = 0; i < n + 1; i++){
                dp[i][0] = 1; 
            }
            for(int i = 1; i < n + 1; i++){
                for(int j = 1; j < m + 1; j++){
                    if(s[i - 1] == t[j - 1]){
                        dp[i][j] = dp[i - 1][j - 1] + dp[i -1][j];
                        if(dp[i][j]>INT_MAX){
                            dp[i][j]=0;
                        }
                    }else{
                        dp[i][j] = dp[i - 1][j];
                    }
                }
            }
            return dp[n][m];
        }
    
⭕️72. 编辑距离
  • 前面说过两个单词或者两个字符串的问题不是双指针就是动态规划问题,很明显这个这么难的问题就是动态规划。

    同时又是两个字符串比较,那肯定 d p [ i ] [ j ] dp[i][j] dp[i][j]啊!主要是这个状态转移方程不太好想

    当两个字符不相等的时候,有三种操作:删除、插入和替换!!!这才是状态转移方程的重点!!

    word1[i] == word2[j]dp[i][j] = dp[i-1][j-1]

    word1[i] != word2[j]dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1

    其中,dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。

int third_min(int a, int b, int c){
    int temp = a < b ? a : b; 
    return temp < c ? temp : c;
}
int minDistance(string word1, string word2) {
    int n = word1.size();
    int m = word2.size();
    vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
    //确定完dp后还是得考虑极端情况
    for(int i = 0; i < m + 1; i++){
        dp[0][i] = i ;
    }
    for(int i = 0; i < n + 1; i++){
        dp[i][0] = i ;
    }

    for(int i = 1; i < n + 1; i++){
        for(int j = 1; j < m + 1; j++){
            if(word1[i - 1] == word2[j - 1]){
                dp[i][j] = dp[i - 1][j - 1];
            }else{
                dp[i][j] = third_min(
                    dp[i - 1][j - 1] + 1, //替换
                    dp[i - 1][j] + 1,     //word1删除一个字符然后换和word2相同的,这个是一个操作
                    dp[i][j - 1] + 1     //word2删除一个字符然后换和word1相同的,这个是一个操作
                );
            }
        }
    }
    return dp[n][m];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1266089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业人力资源公司抖音直播招聘断播怎么处理?

企业人力资源公司抖音直播招聘断播怎么处理&#xff1f; 最直接的处理方式就是进行抖音直播招聘报白&#xff0c;报白后在直播和视频中发布招聘和企业信息&#xff0c;不用担心被封禁和限制流量。 可以通过抖音直播进行招聘&#xff0c;也可以在视频中添加小程序&#xff0c;…

服务器数据恢复—服务器重装系统导致逻辑卷发生改变的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌linux操作系统服务器&#xff0c;服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。 服务器故障&检测&#xff1a; 服务器在运行过程中突然瘫痪&#xff0c;管理员对服务器进行了重装…

LINUX入门篇【11】---进程篇【3】---进程优先级,进程切换,进程调度

前言&#xff1a; 有了前面知识点的铺垫&#xff0c;本篇我们将围绕进程的三个方面来展开&#xff0c;即进程优先级&#xff0c;进程切换以及进程调度的问题&#xff0c;这里的进程调度其实本质就是CPU是如何去调度进程的。 进程优先级&#xff1a; 优先级的概念&#xff1a…

数字人透明屏幕是如何工作的?

数字人透明屏幕是一种令人兴奋的科技产品&#xff0c;它结合了人脸识别、全息影像技术以及透明屏幕&#xff0c;为人们带来了全新的互动体验。本文将详细介绍数字人透明屏幕的工作原理以及其应用场景。 工作原理 数字人透明屏幕的工作原理主要包括人脸识别和全息影像技术。人脸…

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一&#xff1a; 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…

浅谈硬件连通性测试几大优势

硬件连通性测试是确保硬件系统正常运行、提高系统可靠性和降低生产成本的关键步骤。在现代工程和制造中&#xff0c;将连通性测试纳入生产流程是一个明智的选择&#xff0c;有助于确保硬件产品的质量和性能达到最优水平。本文将介绍硬件连通性测试的主要优势有哪些! 一、提高系…

区域人员定位管理系统功能

人员定位管理系统是集计算机软硬件、信息采集处理、无线数据传输、网络数据通讯等技术多学科综合应用为一体的自动识别信息技术产品&#xff0c;实现对不同物体&#xff08;包括人&#xff09;在不同状态&#xff08;移动、静止&#xff09;下的自动识别&#xff0c;特定区域人…

深度学习框架配置

目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn&#xff0c;将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3.…

2004-2022年上市公司托宾Q值数据

2004-2022年上市公司托宾Q值数据 1、时间&#xff1a;2004-2022年 2、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、托宾Q值 3、范围&#xff1a;上市公司 4、来源&#…

Redis 的过期策略都有哪些?

思考:假如redis的key过期之后&#xff0c;会立即删除吗&#xff1f; Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略…

leetcode:用栈实现队列(先进先出)

题目描述 题目链接&#xff1a;232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先把之前写的数组栈的实现代码搬过来 用栈实现队列最主要的是实现队列先进先出的特点&#xff0c;而栈的特点是后进先出&#xff0c;那么我们可以用两个栈来实现&…

python与机器学习1,机器学习的一些基础知识概述(完善ing)

目录 1 AI ,ML,DL,NN 等等概念分类 1.1 人工智能、机器学习、深度学习、神经网络之间的关系&#xff1a; 1.2 人工智能的发展 2 ML机器学习的分类&#xff1a;SL, USL,RL 2.1 机器学习的分类 2.2 具体的应用举例 2.3 数据分类 3 关于阈值θ和偏移量b的由来 4 不同的激…

【LeetCode:1670. 设计前中后队列 | 数据结构设计】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

​无人机摄影测量

无人机摄影测量技术是传统航空摄影测量手段的有力补充&#xff0c;具有机动灵活、高效快速、精细准确、作业成本低、生产周期短、影像获取空间分辨率高、高危地区探测等优势。无人机与航空摄影测量相结合使得“无人机数字低空遥感”成为航空遥感领域的一个崭新发展方向。无人机…

【古月居《ros入门21讲》学习笔记】16_tf坐标系广播与监听的编程实现

目录 说明&#xff1a; 1. 实现过程&#xff08;C&#xff09; 创建功能包&#xff08;C&#xff09; 创建tf广播器代码&#xff08;C&#xff09; 创建tf监听器代码&#xff08;C&#xff09; 配置tf监听器与广播器代码编译规则 编译并运行 编译 运行 2. 实现过程&a…

全新仿某度文库网站源码/在线文库源码/文档分享平台网站源码/仿某度文库PHP源码

源码简介&#xff1a; 全新仿某度文库网站源码/在线文库源码&#xff0c;是以phpMySQL开发的&#xff0c;它是仿某度文库PHP源码。有功能免费文库网站 文档分享平台 实现文档上传下载及在线预览。 仿百度文库是一个以phpMySQL进行开发的免费文库网站源码。仿某度文库实现文档…

API网关

API网关的作用 下图显示了详细信息。 步骤 1 - 客户端向 API 网关发送 HTTP 请求。 步骤 2 - API 网关解析并验证 HTTP 请求中的属性。 步骤 3 - API 网关执行允许列表/拒绝列表检查。 步骤 4 - API 网关与身份提供商对话以进行身份​​验证和授权。 步骤 5 - 将速率限制规…

卓越进行时 | 西安交通大学校友莅临赛宁网安参观考察

近日&#xff0c;为了深入贯彻网络安全强国战略建设&#xff0c;积极发挥网络安全企业的先进作用&#xff0c;推动校企合作与协作共赢。西安交通大学领导携校友会来到赛宁网安网络安全卓越中心进行参观考察&#xff0c;为进一步的校企合作和产业孵化奠定基础。 活动期间&#…

考虑区域多能源系统集群协同优化的联合需求侧响应模型程序代码!

本程序参考中国电机工程学报论文《考虑区域多能源系统集群协同优化的联合需求侧响应模型》&#xff0c;文章使用关系矩阵来表示电、热、气的耦合关系&#xff0c;使用NSGA2方法对多目标优化方法进行求解&#xff0c;文章中考虑环境因素是目前研究的热点。程序中算例丰富&#x…

SEO工具-免费功能最全的5款SEO工具

随着互联网的蓬勃发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为许多企业和个人网站必备的关键技能。然而&#xff0c;对于初学者或者运营小型网站的人来说&#xff0c;使用专业的SEO工具可能涉及较高的成本。在这篇文章中&#xff0c;我们将向您推荐五款高…