代码随想录算法训练营第44天|LeetCode 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

news2024/11/15 19:30:28

1. LeetCode 1143.最长公共子序列

题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/
文章链接:https://programmercarl.com/1143.最长公共子序列.html
视频链接:https://www.bilibili.com/video/BV1ye4y1L7CQ

在这里插入图片描述
1.确定dp数组(dp table)以及下标的含义
dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]
2.确定递推公式
主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同
1️⃣如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;
2️⃣如果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]);
3.dp数组如何初始化
统一初始为0。
4.确定遍历顺序
从前向后,从上到下来遍历。

解法:
class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        //1.定义dp数组
        //dp[i][j]表示以下标i-1结尾的子串a和以下标j-1结尾的子串的最长公共子序列的长度
        int[][] dp = new int[text1.length()+1][text2.length()+1];
        //2.递推公式
        /**
        if (text1.charAt(i-1) == text2.charAt(j-1)) {
            dp[i][j] = dp[i-1][j-1]+1;
        } else {
            dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
        }
         */
        
        //3.初始化
        //4.遍历顺序
        int res = 0;
        for (int i=1;i<text1.length()+1;i++) {
            for (int j=1;j<text2.length()+1;j++) {
                if (text1.charAt(i-1) == text2.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j-1]+1;
                } else {
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }

                res = Math.max(res,dp[i][j]);
            }
        }

        return res;

    }
}

2. LeetCode 1035.不相交的线

题目链接:https://leetcode.cn/problems/uncrossed-lines/description/
文章链接:https://programmercarl.com/1035.不相交的线.html#思路
视频链接:https://www.bilibili.com/video/BV1h84y1x7MP

在这里插入图片描述

思路:本题等价于求解公共子序列

解法:
class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        //本题等价于求解公共子序列(非连续)
        //1.定义dp数组
        //dp[i][j]表示以nums[i-1]结尾的序列和以nums2[j-1]结尾的序列的公共子序列长度
        int[][] dp = new int[nums1.length+1][nums2.length+1];
        //2.递推公式
        /**
        if (nums1[i-1]==nums2[j-1]) {
            dp[i][j] = dp[i-1][j-1] + 1;
        } else {
            dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
        }
         */
        //3.初始化
        //4.遍历顺序 从前往后
        int res=0;
        for (int i=1;i<nums1.length+1;i++) {
            for (int j=1;j<nums2.length+1;j++) {
                if (nums1[i-1]==nums2[j-1]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }

                res = Math.max(res,dp[i][j]);
            }
        }

        return res; 
    }
}

3. LeetCode 53. 最大子序和

题目链接:https://leetcode.cn/problems/maximum-subarray/description/
文章链接:https://programmercarl.com/0053.最大子序和(动态规划).html
视频链接:https://www.bilibili.com/video/BV19V4y1F7b5

在这里插入图片描述

思路:
1.确定dp数组(dp table)以及下标的含义
dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。
2.确定递推公式
dp[i]只有两个方向可以推出来:
nums[i]+dp[i - 1],即:nums[i]加入当前连续子序列和
nums[i],即:从头开始计算当前连续子序列和
一定是取最大的,所以dp[i] = max(nums[i]+dp[i - 1], nums[i]);
3.dp数组如何初始化
dp[0] = nums[0]。
4.确定遍历顺序
递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。
5.返回值
dp数组中的最大值。

解法:
class Solution {
    // // 贪心
    // public int maxSubArray(int[] nums) {
       
    //     int res = nums[0];
    //     int count = 0;
    //     for (int i=0;i<nums.length;i++) {
    //         count += nums[i];
    //         if (count > res) {// 取区间累计的最大值(相当于不断确定最大子序终止位置)
    //             res = count;
    //         }
    //         if (count <= 0) {
    //             count = 0;// 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
    //         }
    //     }

    //     return res;
    // }

    // 动态规划
    public int maxSubArray(int[] nums) {
        //1.定义dp数组 
        //dp[i]表示以nums[i]结尾的最大连续子数组之和
        int[] dp = new int[nums.length];
        //2.递推公式
        //dp[i] = Math.max(nums[i]+dp[i-1],nums[i]);
        //3.初始化
        dp[0]=nums[0];
        //4.遍历顺序 从前往后
        int res = nums[0];
        for (int i=1;i<nums.length;i++) {
            dp[i] = Math.max(nums[i]+dp[i-1],nums[i]);
            res = Math.max(res,dp[i]);
        }

        return res;
    }
}

4. LeetCode 392.判断子序列

题目链接:https://leetcode.cn/problems/is-subsequence/description/
文章链接:https://programmercarl.com/0392.判断子序列.html
视频链接:https://www.bilibili.com/video/BV1tv4y1B7ym/

在这里插入图片描述

思路:与最长公共子序列一致。

解法:
class Solution {
    public boolean isSubsequence(String s, String t) {
        char[] nums1 = s.toCharArray();
        char[] nums2 = t.toCharArray();
        //1.定义dp数组
        //dp[i][j]表示以nums[i-1]结尾的子序列和以nums[j-1]结尾的子序列的最长公共子序列长度
        int[][] dp = new int[nums1.length+1][nums2.length+1];
        //2.递推公式
        /**
        if (nums[i-1]==nums[j-1]) {
            dp[i][j] = dp[i-1][j-1]+1;
        } else {
            dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
        }
         */
        //3.初始化
        //4.遍历顺序
        int res = 0; 
        for (int i=1;i<nums1.length+1;i++) {
            for (int j=1;j<nums2.length+1;j++) {
                if (nums1[i-1]==nums2[j-1]) {
                    dp[i][j] = dp[i-1][j-1]+1;
                } else {
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
                res=Math.max(res,dp[i][j]);
            }
        }

        return res==nums1.length; 
        
    }
}

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

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

相关文章

苹果离线打包机配置和打包

1、虚拟机安装 macOS虚拟机安装全过程&#xff08;VMware&#xff09;-腾讯云开发者社区-腾讯云 给 windows 虚拟机装个 mac 雪之梦 1、安装苹果镜像 去网上下载&#xff0c;打包机的镜像要和自己mac电脑上的保持一致。 同时打包机的用户名也需要和自己的mac保持一致。 2、…

云原生专题-k8s基础系列-k8s-namespaces详解

获取所有的pod实例&#xff1a; k8s中&#xff0c;命名空间&#xff08;Namespace&#xff09;提供一种机制&#xff0c;将同一集群中的资源划分为相互隔离的组。同一命名空间内的资源名称要唯一&#xff0c;命名空间是用来隔离资源的&#xff0c;不隔离网络。 https://kubern…

Kafka 实战使用、单机搭建、集群搭建、Kraft集群搭建

文章目录 实验环境单机服务启动停止服务简单收发消息其他消费模式理解Kakfa的消息传递机制 集群服务为什么要使用集群部署Zookeeper集群部署Kafka集群理解服务端的Topic、Partition和Broker总结 Kraft集群相关概念 实验环境 准备三台虚拟机 三台机器均预装CentOS7 操作系统。…

探索Transformer中的多头注意力机制:如何利用GPU并发

什么是多头注意力机制&#xff1f; 首先&#xff0c;什么是多头注意力机制&#xff1f;简单来说&#xff0c;它是Transformer模型的核心组件之一。它通过并行计算多个注意力头&#xff08;attention heads&#xff09;&#xff0c;使模型能够从不同的表示子空间中捕捉不同的特…

Oracle服务器windows操作系统升级出现计算机名称改变导致数据库无法正常连接

1.数据库莫名奇妙无法正常连接&#xff0c;经排查是主机名称改变&#xff0c;导致oracle无法正常运行 如何查看ORACLE主机名称及路径&#xff1a;需要修改 listener 和 tnsnames的配置的主机名 2.修改tnsnames配置的主机名称&#xff0c;HOST主机名称 3.修改listener中的主机…

【案例36】Apache未指向新的openssl

客户发现apache报openssl相关漏洞&#xff0c;于是升级了操作系统的openssl组件。但再次漏扫发现相关版本依旧显示openssl的版本为&#xff1a;1.0.2k。怀疑升级的有问题。 问题分析 查看libssl.so.10指向的是/lib64.so.10 ldd mod_ssl.so libssl.so.10指向的是openssl1.0.2k…

【实际案例】服务器宕机情况分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器&#xff1a; Kunpeng 920 内存&#xff1a; 4 TiB BIOS版…

【JVM基础18】——实践-Java内存泄漏排查思路?

目录 1- 引言&#xff1a;2- ⭐核心&#xff1a;2-1 排查思路2-2 步骤1&#xff1a;获取堆内存快照 dump2-3 步骤2、3&#xff1a;使用 VisualVM 打开 dump文件 3- 小结&#xff1a;3-1 Java内存泄漏排查思路&#xff1f; 1- 引言&#xff1a; 首先得明确哪里会产生内存泄漏的…

Solidworks API利用C# 实现物体的运动与碰撞检测

详情见github连接 SolidWorks-API-Collision-Detection Use SolidWorks API to MovePart and Collision Detection 利用solidworks的API来移动控件物体以及进行碰撞检测 visual studio 2022 利用Nuget 安装这些库 打开solidworks 可以看到有两个控件 部件运动 使用封装的函…

嵌入式初学-C语言-十七

#接嵌入式初学-C语言-十六# 函数的递归调用 含义&#xff1a; 在一个函数中直接或者间接调用了函数本身&#xff0c;称之为函数的递归调用 // 直接调用a()->a(); // 间接调用a()->b()->a();a()->b()->..->a();递归调用的本质&#xff1a; 本是是一种循环…

深入理解Spring的三级缓存机制

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Ubuntu(20.04 LTS)更换镜像源

此换镜像源方法只适用x86_64架构的系统&#xff0c;其他架构的系统参考ubuntu-ports的方法 1、备份文件 sudo mv /etc/apt/sources.list /etc/apt/sources.list.bk2、创建新文件 sudo vi /etc/apt/sources.list根据自己系统版本选择下面对应的镜像源添加到新文件中&#xf…

智能指针--

智能指针简介 头文件&分类 智能指针都在memory中&#xff0c; 有auto_ptr, unique_ptr, shared_ptr, weak_ptr 智能指针发展史 C&#xff0b;&#xff0b;98就有智能指针了&#xff08;auto_ptr&#xff09; c&#xff0b;&#xff0b;11前&#xff0c;智能指针主要靠bo…

FPGA开发——在Quartus中实现对IP核的PLL调用

一、简介 PLL主要由鉴相器&#xff08;PD&#xff09;、环路滤波器&#xff08;LF&#xff09;和压控振荡器&#xff08;VCO&#xff09;三部分组成。鉴相器检测输入信号与VCO输出信号的相位差&#xff0c;并输出一个与相位差成正比的电压信号。该信号经过环路滤波器滤除高频噪…

esp32学习笔记

前言&#xff1a;学习视频链接放在最后&#xff0c;开发方式为esp32Arduino&#xff0c;使用型号为ESP32-WROOM-32&#xff0c;引脚功能分配图如下。 #esp32介绍 GPIO的引脚默认情况下&#xff0c;只能当做普通功能引脚使用&#xff0c;也就是只能输入&#xff0c;输出&#x…

git 常用指令(创建分支、提交分支、解决冲突)

1. 初始化git 将你的代码放入你创建的文件中&#xff0c;执行 git init(前提你电脑安装过git哈)2. 查看当前项目git 状态 git status 3. 将代码添加到暂存区 git add . &#xff08;提交所有修改的代码&#xff0c;如果向指定提交使用&#xff1a;git add <文件名>&am…

SQL语句创建数据库(增删查改)

SQL语句 一.数据库的基础1.1 什么是数据库1.2 基本使用1.2.1 连接服务器1.2.2 使用案例 1.2 SQL分类 二.库的操作2.1 创建数据库2.2 创建数据库示例2.3 字符集和校验规则2.3.1 查看系统默认字符集以及校验规则2.3.2查看数据库支持的字符集2.3.3查看数据库支持的字符集校验规则2…

【RTOS面试题】ISR中可以使用互斥锁和信号量吗?

在中断服务程序&#xff08;ISR, Interrupt Service Routine&#xff09;中直接使用互斥锁&#xff08;mutex&#xff09;和信号量&#xff08;semaphore&#xff09;是有风险的&#xff0c;因为这些同步机制通常不是中断安全的。但是&#xff0c;可以通过一些方法来安全地在 I…

QWT+Qt Creator+MSVC的配置与使用

目录 一、介绍 二、QWT下载 三、QWT编译 3.1 设置构建套件 3.2 修改QWT相关文件 3.3 进行QWT编译 四、QWT配置 4.1 配置QWT的lib文件 4.2 配置QWT的dll文件 4.3 配置QWT的designer的dll文件 五、代码实验 一、介绍 QWT&#xff0c;全称是Qt Widgets for Technical…

Python 异步编程:Asyncio 实现原理

常见的并发模型 多进程/多线程异步ActorPub/Sub Python 异步的基石&#xff1a;协程 协程简介 概念&#xff1a;协作式多任务的子程序&#xff0c;用户态线程或微线程&#xff08;Coroutine&#xff09;。 特点&#xff1a;子程序执行可以中断&#xff0c;恢复后不会丢失之…