第五十三天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

news2024/9/30 21:21:35

Leetcode 1143.最长公共子序列

题目链接:1143 最长公共子序列

题干:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

思考:动态规划。

  • 确定dp数组(dp table)以及下标的含义

dp[i][j]:字符串text1的处理区间[0, i - 1]与字符串text2的处理区间[0, j - 1]中,存在的最长公共子序列的长度。

至于为什么要定义长度为[0, i - 1]的字符串text1,而不是定义为长度为[0, i]的字符串text1。

这主要是为了简化初始化操作,具体理由在 Leetcode 718. 最长重复子数组 中有讲解。

  • 确定递推公式

遍历过程就两种情况: text1[i - 1] 与 text2[j - 1]相同 以及 text1[i - 1] 与 text2[j - 1]不相同。

如果text1[i - 1] 与 text2[j - 1]相同,即找到一个公共元素,则在 text1[0, i - 2]与text2[0, j - 2]的最长公共子序列的末尾再加上此次找到的公共元素(即两字符串均缩小处理区间的结果加一)。因此dp[i][j] = dp[i - 1][j - 1] + 1;

如果text1[i - 1] 与 text2[j - 1]不相同,那就比较text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列(即任选一字符串缩小处理区间的结果),取最大的,则dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

  • dp数组如何初始化

test1[0, i-1]和空串的最长公共子序列自然是0,所以dp[i][0] = 0;同理dp[0][j]也是0。

其他下标都是随着递推公式逐步覆盖,初始为多少都可以,所以可以统一初始为0。

  • 确定遍历顺序

从递推公式,可以看出,有三个方向可以推出dp[i][j],如图:

在递推的过程中,这三个方向都是经过计算的数值,所以要从前向后,从上到下来遍历矩阵。

  • 举例推导dp数组

举例:text1 = "abcde", text2 = "ace" ,dp状态如图:

代码:

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        //dp[i][j]:字符串text1的处理区间[0, i - 1]与字符串text2的处理区间[0, j - 1]中,存在的最长公共子序列的长度
        vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));     

        for (int i = 1; i <= text1.size(); i++) {           //遍历text1字符串
            for (int j = 1; j <= text2.size(); j++) {       //遍历text2字符串
                if (text1[i - 1] == text2[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[text1.size()][text2.size()];
    }
};

Leetcode 1035.不相交的线

题目链接:1035 不相交的线

题干:在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:

  •  nums1[i] == nums2[j]
  • 且绘制的直线不与任何其他连线(非水平线)相交。

请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

以这种方法绘制线条,并返回可以绘制的最大连线数。

思考:动态规划。本题如果从怎么判断连线相交的角度思考会卡壳,如果将不相交理解为前后连线元素的相对顺序和数组的相对顺序一致,可以发现本题和上题一模一样。

直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。

因此本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度。

代码:

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        //dp[i][j]: 数组nums1的处理区间[0, i - 1]与数组nums2的处理区间[0, j - 1]中,存在的最大连线数
        vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));

        for (int i = 1; i <= nums1.size(); i++) {           //遍历数组nums1
            for (int j = 1; j <= nums2.size(); j++){        //遍历数组nums2
                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[nums1.size()][nums2.size()];
    }
};

Leetcode 53. 最大子序和

题目链接:53 最大子序和

题干:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

思考:此题的贪心法解法:53. 最大子序和。下面为动态规划解法。

  • 确定dp数组(dp table)以及下标的含义

dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和。

  • 确定递推公式

从dp[i]的定义,可以看出dp[i]只有两个方向可以推出:

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
  • nums[i],即:从头开始计算当前连续子序列和

并且要取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

  • dp数组如何初始化

从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,dp[0]就是递推公式的基础。

根据dp[i]的定义,明显dp[0]应为nums[0]即dp[0] = nums[0]。

  • 确定遍历顺序

递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。

  • 举例推导dp数组

举例:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下:

要找最大的连续子序列和,就应该比较每一个i为终点的连续最大子序列和。取其中最大值。

代码:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp(nums.size());        //dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和
        dp[0] = nums[0];
        int result = dp[0];       //记录最大和

        for (int i = 1; i < nums.size(); i++) {
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);        //递推公式
            if (dp[i] > result) result = dp[i];
        }
        return result;
    }
};

自我总结:

        最长公共子序列和还没理解清晰。

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

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

相关文章

no main manifest attribute,in xxx.jar(关于Spring项目,无法在云服务器上运行jar包的解决方法)

目录 问题详情 解决方法 问题详情 项目可以打包正常&#xff0c;但是云服务器上无法运行&#xff0c;报错&#xff1a;no main manifest attribute&#xff0c;in xxx.jar 解决方法 1.查看pom.xml配置文件&#xff0c;检查以下代码&#xff0c;没有则加上&#xff1a; <…

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大&#xff0c;高校内的党员统计及发展管理工作面临较大的压力&#xff0c;高校信息化建设的不断优化发展也进一步促进了系统平台的应用&#xff0c;借助系统平台可以实现更加高效便捷的党员信息…

P8680 [蓝桥杯 2019 省 B] 特别数的和:做题笔记

目录 思路 代码 题目链接&#xff1a; P8680 [蓝桥杯 2019 省 B] 特别数的和 思路 最开始我思路主要是从数字转字符串上想的。因为我们需要判断每一位是否是特殊数&#xff0c;字符串很容易做到这一点&#xff0c;只是在数字相加这一步不好实现。 需要用到字符串与数字的…

复盘-word

word-大学生网络创业交流会 设置段落&#xff0c;段后行距才有分 word-选中左边几行字进行操作 按住alt键进行选中 word复制excel随excel改变&#xff08;选择性粘贴&#xff09; 页边距为普通页边距定义 ##### word 在内容控件里面填文字&#xff08;调属性&#xff09…

会话_过滤器_监听器笔记

一&#xff1a;会话 1&#xff1a;Cookie&#xff1a; cookie是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。 服务端创建cookie,将cookie放入响应对象中,Tomcat容器将cookie…

缓解LLM的局限性:微调 VS RAG

原文地址&#xff1a;Knowledge Graphs & LLMs: Fine-Tuning Vs. Retrieval-Augmented Generation 2023 年 6 月 6 日 GitHub&#xff1a;https://github.com/neo4j/NaLLM 大型语言模型 (LLM) 的第一波炒作来自 ChatGPT 和类似的基于网络的聊天机器人&#xff0c;相信在…

Kap - macOS 开源录屏工具

文章目录 关于 Kap 关于 Kap Kap 是一个使用web技术的开源的屏幕录制工具 官网&#xff1a;https://getkap.cogithub : https://github.com/wulkano/Kap 目前只支持 macOS 12 以上&#xff0c;支持 Intel 和 Apple silicon 你可以前往官网&#xff0c;右上方下载 你也可以使…

Spring Boot 中使用 Redis + Aop 进行限流

Spring Boot 中使用 Redis 进行限流&#xff0c;通常你可以采用如下几种方式&#xff1a; 令牌桶算法&#xff08;Token Bucket&#xff09;漏桶算法&#xff08;Leaky Bucket&#xff09;固定窗口计数器&#xff08;Fixed Window Counter&#xff09;滑动日志窗口&#xff08…

自然语言发展历程

一、基础知识 自然语言处理&#xff1a;能够让计算理解人类的语言。 检测计算机是否智能化的方法&#xff1a;图灵测试 自然语言处理相关基础点&#xff1a; 基础点1——词表示问题&#xff1a; 1、词表示&#xff1a;把自然语言中最基本的语言单位——词&#xff0c;将它转…

docker学习(十四)docker搭建私服

docker私服搭建&#xff0c;配置域名访问&#xff0c;设置访问密码 启动registry docker run -d \-p 5000:5000 \-v /opt/data/registry:/var/lib/registry \registrydocker pull hello-world docker tag hello-world 127.0.0.1:5000/hello-world docker push 127.0.0.1:5000…

深入浅出计算机网络 day.1 概论② 因特网概述

当你回头看的时候&#xff0c;你会发现自己走了一段&#xff0c;自己都没想到的路 —— 24.3.9 内容概述 01.网络、互连&#xff08;联&#xff09;网与因特网的区别与联系 02.因特网简介 一、网络、互连&#xff08;联&#xff09;网与因特网的区别与联系 1.若干节点和链路互连…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:网关服务、认证服务与系统服务

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

【Linux】深入探究CentOS防火墙(Firewalld):基础概念、常用命令及实例操作

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Firewalld基础概念&#xff1a; Firewalld常用命令&#xff1a; 启动/停止/重启Firewalld服务&#xff1a; 查看Firewalld状态…

OpenStack之Glance

一、概述 Glance&#xff08;OpenStack Image Service&#xff09;是一个提供发现&#xff0c;注册&#xff0c;和下载镜像的服务。Glance 提供了虚拟机镜像的集中存储。通过 Glance 的 RESTful API&#xff0c;可以查询镜像元数据、下载镜像。虚拟机的镜像可以很方便的存储在…

【Java.mysql】——增删查改(CRUD)之 增查(CR) 附加数据库基础知识

目录 &#x1f6a9;数据库操作 &#x1f388;创建数据库 &#x1f388;使用数据库 &#x1f388;删除数据库 &#x1f6a9;数据类型 &#x1f6a9;表的操作 &#x1f388;创建表 &#x1f308;查看表结构 &#x1f388;删除表 ❗练习(综合运用) &#x1f5a5;️新增…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…

三、实战篇 优惠券秒杀

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、全局唯一ID 数据库默认自增的存在的问题&#xff1a; id增长规律明显受单表数据量的限制 场景一分析&#xff1a;id如果增长规律归于明显&#xff0c;容易被用户或者商业对手猜测出一些敏感信息&…

【JavaScript】JavaScript 变量 ① ( JavaScript 变量概念 | 变量声明 | 变量类型 | 变量初始化 | ES6 简介 )

文章目录 一、JavaScript 变量1、变量概念2、变量声明3、ES6 简介4、变量类型5、变量初始化 二、JavaScript 变量示例1、代码示例2、展示效果 一、JavaScript 变量 1、变量概念 JavaScript 变量 是用于 存储数据 的 容器 , 通过 变量名称 , 可以 获取 / 修改 变量 中的数据 ; …

C语言——函数指针——函数指针变量(详解)

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针&#xff0c;它可以用来存储函数的地址&#xff0c;并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面&#xff1a; 回调函数&#xff1a;函数指针变量可以作为参数传递给其他函数&…

VBA_NZ系列工具NZ02:VBA读取PDF使用说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…