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

news2024/9/21 0:41:45

1143.最长公共子序列

在这里插入图片描述

题目链接:1143.最长公共子序列
文档讲解:代码随想录
状态:一开始没想明白为啥要 max(dp[i - 1][j], dp[i][j - 1])

思路:
如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以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]);

题解:

    // 二维动态规划方法
    public int longestCommonSubsequence(String text1, String text2) {
        char[] chars1 = text1.toCharArray();
        char[] chars2 = text2.toCharArray();
        int m = chars1.length;
        int n = chars2.length;

        // 创建二维dp数组,dp[i][j]表示text1前i个字符和text2前j个字符的最长公共子序列长度
        int[][] dp = new int[m + 1][n + 1];

        // 遍历每个字符,填充dp数组
        for (int i = 1; i <= chars1.length; i++) {
            for (int j = 1; j <= chars2.length; j++) {
                if (chars1[i - 1] == chars2[j - 1]) {
                    // 如果字符相等,则当前状态等于左上角状态加1
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    // 如果字符不相等,则当前状态等于上方和左方状态的最大值
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }

        // 返回最终结果,dp[m][n]即为最长公共子序列长度
        return dp[m][n];
    }

    // 一维动态规划方法(空间优化)
    public int longestCommonSubsequence2(String text1, String text2) {
        char[] chars1 = text1.toCharArray();
        char[] chars2 = text2.toCharArray();
        int n = chars2.length;

        // 创建一维dp数组,dp[j]表示text1前i个字符和text2前j个字符的最长公共子序列长度
        int[] dp = new int[n + 1];

        // 遍历每个字符,填充dp数组
        for (int i = 1; i <= chars1.length; i++) {
            int pre = dp[0]; // 保存左上角的值
            for (int j = 1; j <= chars2.length; j++) {
                int cur = dp[j]; // 当前dp[j]的值,在更新dp[j]之前保存它
                if (chars1[i - 1] == chars2[j - 1]) {
                    // 如果字符相等,则当前状态等于左上角状态加1
                    dp[j] = pre + 1;
                } else {
                    // 如果字符不相等,则当前状态等于上方和左方状态的最大值
                    dp[j] = Math.max(dp[j], dp[j - 1]);
                }
                pre = cur; // 更新pre为当前dp[j]的值
            }
        }

        // 返回最终结果,dp[n]即为最长公共子序列长度
        return dp[n];
    }

1035.不相交的线

在这里插入图片描述

题目链接:1035.不相交的线
文档讲解:代码随想录
状态:还行

思路:
直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。
所以,本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!

题解:

class Solution {
    // 二维动态规划方法
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        
        // 创建二维dp数组,dp[i][j]表示nums1前i个元素和nums2前j个元素能形成的最大不相交的线数
        int[][] dp = new int[m + 1][n + 1];

        // 遍历每个元素,填充dp数组
        for (int i = 1; i <= nums1.length; i++) {
            for (int j = 1; j <= nums2.length; j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    // 如果元素相等,则当前状态等于左上角状态加1
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    // 如果元素不相等,则当前状态等于上方和左方状态的最大值
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }

        // 返回最终结果,dp[m][n]即为最大不相交的线数
        return dp[m][n];
    }

    // 一维动态规划方法(空间优化)
    public int maxUncrossedLines2(int[] nums1, int[] nums2) {
        int n = nums2.length;
        
        // 创建一维dp数组,dp[j]表示nums1前i个元素和nums2前j个元素能形成的最大不相交的线数
        int[] dp = new int[n + 1];

        // 遍历每个元素,填充dp数组
        for (int i = 1; i <= nums1.length; i++) {
            int pre = dp[0]; // 保存左上角的值
            for (int j = 1; j <= nums2.length; j++) {
                int cur = dp[j]; // 当前dp[j]的值,在更新dp[j]之前保存它
                if (nums1[i - 1] == nums2[j - 1]) {
                    // 如果元素相等,则当前状态等于左上角状态加1
                    dp[j] = pre + 1;
                } else {
                    // 如果元素不相等,则当前状态等于上方和左方状态的最大值
                    dp[j] = Math.max(dp[j], dp[j - 1]);
                }
                pre = cur; // 更新pre为当前dp[j]的值
            }
        }

        // 返回最终结果,dp[n]即为最大不相交的线数
        return dp[n];
    }
}

53. 最大子序和

在这里插入图片描述

题目链接:53. 最大子序和
文档讲解:代码随想录
状态:还行

思路:
dp[i]只有两个方向可以推出来:

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

题解:

   // 贪心算法:每次加上的数字如果不能使sum增加,那就从下个数字开始
    public int maxSubArray(int[] nums) {
        int max = nums[0]; // 初始化最大子数组和为数组的第一个元素
        int sum = 0; // 当前子数组和
        for (int num : nums) {
            sum += num; // 更新当前子数组和
            max = Math.max(max, sum); // 更新最大子数组和
            if (sum <= 0) {
                sum = 0; // 如果当前子数组和为负数或0,从下一个元素重新开始计算
            }
        }
        return max; // 返回最大子数组和
    }

    // 动态规划算法:dp[i]表示以第i个元素结尾的最大子数组和
    public int maxSubArray2(int[] nums) {
        int[] dp = new int[nums.length + 1]; // 创建dp数组,长度为nums.length+1
        dp[0] = nums[0]; // 初始化dp[0]为数组的第一个元素
        int max = nums[0]; // 初始化最大子数组和为数组的第一个元素
        for (int i = 1; i < nums.length; i++) {
            // dp[i]表示以第i个元素结尾的最大子数组和
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            // 更新最大子数组和
            max = Math.max(max, dp[i]);
        }
        return max; // 返回最大子数组和
    }

392.判断子序列

在这里插入图片描述

题目链接:392.判断子序列
文档讲解:代码随想录
状态:so easy

思路:
可以双指针,也可以动态规划。

题解:

    // 双指针方法判断s是否为t的子序列
    public boolean isSubsequence(String s, String t) {
        // 将字符串s和t转换为字符数组
        char[] sChars = s.toCharArray();
        char[] tChars = t.toCharArray();

        // 初始化两个指针,分别指向sChars和tChars的起始位置
        int j = 0;

        // 遍历tChars数组
        for (int i = 0; i < tChars.length && j < sChars.length; i++) {
            // 如果当前字符相等,则移动指向sChars的指针
            if (tChars[i] == sChars[j]) {
                j++;
            }
        }

        // 如果j等于sChars的长度,说明s是t的子序列
        return j == sChars.length;
    }

    public boolean isSubsequence2(String s, String t) {
        char[] chars1 = s.toCharArray();
        char[] chars2 = t.toCharArray();
        int n = chars2.length;

        // 创建一维dp数组,dp[j]表示text1前i个字符和text2前j个字符的最长公共子序列长度
        int[] dp = new int[n + 1];

        // 遍历每个字符,填充dp数组
        for (int i = 1; i <= chars1.length; i++) {
            int pre = dp[0]; // 保存左上角的值
            for (int j = 1; j <= chars2.length; j++) {
                int cur = dp[j]; // 当前dp[j]的值,在更新dp[j]之前保存它
                if (chars1[i - 1] == chars2[j - 1]) {
                    // 如果字符相等,则当前状态等于左上角状态加1
                    dp[j] = pre + 1;
                } else {
                    // 如果字符不相等,则当前状态等于上方和左方状态的最大值
                    dp[j] = Math.max(dp[j], dp[j - 1]);
                }
                pre = cur; // 更新pre为当前dp[j]的值
            }
        }

        // 返回最终结果,dp[n]即为最长公共子序列长度
        return dp[n] == chars1.length;
    }

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

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

相关文章

【c语言】玩转文件操作

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给门店提供了含线下收银称重、线上商城、精细化会员管理、ERP进销存、营销活动、移动店务助手等一体化行业解决方案&#xff01; 详细功能见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#…

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

PHP宝藏神器多功能投票系统源码小程序

&#x1f389;发现宝藏神器&#xff01;一键解锁“多功能投票小程序”的无限可能✨ &#x1f308; 开篇安利&#xff1a;告别繁琐&#xff0c;拥抱高效&#xff01; Hey小伙伴们&#xff0c;是不是经常为组织活动、收集意见而头疼不已&#xff1f;&#x1f92f; 今天就要给大…

融云入驻首个数字生态出海基地,加速构建数字经济出海创新生态

7 月 3 日&#xff0c;“2024 全球数字经济大会”重要专题论坛“2024 数字生态出海发展论坛”在北京国家会议中心举行。 论坛由全球数字经济大会组委会主办&#xff0c;北京市经济和信息化局、北京市政务服务和数据管理局、大兴区人民政府共同承办。来自阿联酋、日本、古巴、…

挖到宝了,一个可自动根据设定兴趣主题爬取实时信息的AI挖掘工具。

在这个信息爆炸的时代&#xff0c;我们每天都被海量的资讯淹没。 无论是工作需要还是个人兴趣&#xff0c;我们都希望能够及时获取到最新、最有价值的信息。然而&#xff0c;手动搜索、筛选这些信息不仅耗时耗力&#xff0c;还常常让人感到疲惫。 今天&#xff0c;我给大家推…

【Python】Python中TODO的用法解析

目录 一.Python中的TODO是什么 二.Python中什么时候使用TODO 三.Pycharm中关于TODO的使用方式 一.Python中的TODO是什么 在Python中&#xff0c; TODO 通常不是一个语言内置的关键字或功能&#xff0c;而是被用作一种注释约定&#xff0c;来标记代码中需要进一步实现或改进的…

【Linux】touch

我们在介绍ls这个命令时&#xff0c;提到每个文件在Linux下面都会记录许多的时间参数&#xff0c;其实是有三个主要的变动时间&#xff0c;那么三个时间的意义是什么&#xff1f; 修改时间&#xff08;modification time&#xff0c;mtime)&#xff1a;当该文件的【内容数据】…

mongoDB教程(五):命名规范

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

香蕉云编+uniapp打包ios的开发包和生产包

登录香蕉云编&#xff0c;找到 云编-ios证书生成&#xff0c;新建CSR文件&#xff0c;并下载csr文件。 登录苹果开发者中心&#xff0c;进入证书页面。 1.创建一个证书&#xff0c;选择ios Distribution类型即可&#xff0c;这是个通用的证书&#xff0c;既能用来打正式包又能…

想要做好非标设备行业的项目管理,这篇指南请收好!

近年来&#xff0c;随着制造业的快速发展和产业升级的不断推进&#xff0c;非标设备行业迎来了广阔的发展前景。一方面&#xff0c;制造业的快速发展带来了对非标设备的旺盛需求&#xff0c;尤其是在汽车、电子、航空航天等高端制造业领域&#xff0c;非标自动化设备的应用越来…

协议转换网关的工作原理-天拓四方

在当今数字化和网络化的社会中&#xff0c;不同系统和设备之间的通信至关重要。然而&#xff0c;由于技术多样性、厂商差异以及应用需求的复杂性&#xff0c;不同的系统和设备常常采用不同的通信协议&#xff0c;这使得它们之间的直接通信变得困难。为了解决这一问题&#xff0…

解决线程不安全问题的几种方式

线程不安全问题 日常生活中我们会经常碰到在不同的平台上买各种票的问题&#xff0c;例如在App、线下售票窗口等购买火车票、电影票。这里面就存在着线程安全的问题&#xff0c;因为当多个线程访问同一个资源时&#xff0c;会导致数据出错&#xff0c;例如甲和乙两人同时看中了…

深度解析:当下流行的人工智能大模型生成逻辑

在过去的几年里&#xff0c;人工智能领域经历了前所未有的革新&#xff0c;其中最引人注目的就是大规模预训练模型的崛起。这些模型&#xff0c;如GPT系列、BERT、T5、DALLE和CLIP等&#xff0c;凭借其强大的语言理解和生成能力&#xff0c;已经在自然语言处理&#xff08;NLP&…

ctfshow(web入门-信息搜集)

1.web1 直接F12查看即可 2.web2 根据提示使用抓包工具 3.web3 根据提示使用burp抓包&#xff0c;然后参数使用repeater模块进行发送 4.web4 根据提示先访问robots 5.web5 6.web6 使用dirsearch 即可www.zip 7.web7 8.web8 9.web9 10. web10 11.web11 12.web12 根据提示在底…

wordpress的restfull API使用教程,之如何用postman调试API,以便能使用vue等前端框架开发主题

文章目录 API开发手册在postman中调试这里以 post 一篇文章为例&#xff0c;讲解如何调试&#xff1a; 步骤 1&#xff1a;生成应用密码步骤 2&#xff1a;配置Postman步骤 3&#xff1a;创建文章 参考链接 API开发手册 官方API手册&#xff1a;https://developer.wordpress.o…

京东技术团队撰写的整整986页《漫画学Python》到底有什么魅力?

这是一本Python入门书。无论您是想学习编程的小学生&#xff0c;还是想参加计算机竞赛的中学生&#xff0c;抑或是计算机相关专业的大学生&#xff0c;甚至是正在从事软件开发的职场人&#xff0c;本书都适合您阅读和学习。但您若想更深入地学习Python并进行深层次应用&#xf…

07.C2W2.Part-of-Speech (POS) Tagging and Hidden Markov Models

往期文章请点这里 目录 OverviewPart of Speech TaggingMarkov ChainsMarkov Chains and POS TagsPOS tags as StatesTransition probabilitiesThe transition matrixInitial probabilities Hidden Markov ModelsEmission probabilitiesSummary Calculating ProbabilitiesTran…

【实习问题记录】Nodeclub本地部署

问题描述 在按照官方网站给出的教程一步一步操作以后发现出现以下报错&#xff1a; 问题分析 显示连接不上mongodb&#xff0c;分析报错可能是因为版本不匹配导致的&#xff0c;查看安装的mongodb版本发现是7.0.4&#xff0c;与目标版本不匹配&#xff0c;同时查看mongodb官…

C#写的winform项目无法打包发布?谈谈思路

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…