【LeetCode: 1143. 最长公共子序列 | 暴力递归=>记忆化搜索=>动态规划】

news2024/9/20 20:48:38

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力递归
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 1143. 最长公共子序列

⛲ 题目描述

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

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

例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace” ,它的长度为 3 。
示例 2:

输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc” ,它的长度为 3 。
示例 3:

输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0 。

提示:

1 <= text1.length, text2.length <= 1000
text1 和 text2 仅由小写英文字符组成。

🌟 求解思路&实现代码&运行结果


⚡ 暴力递归

🥦 求解思路

  1. 最长公共子序列问题怎么求解呢?这道题目的求解思路也比较简单,我们通过记录俩个字符串位置元素的下标,一个一个去遍历元素,判断对应位置上的元素是否想等,如果相等,俩个指针同时向右移动,继续下一个位置的判断。否则,我们可以让指向字符串1的指针向右移动去和当前指向字符串2的指针判断此时位置的元素是否相等,或者,我们可以让指向字符串2的指针向右移动去和当前指向字符串1的指针判断此时位置的元素是否相等,取它们二者的最大值。
  2. 为什么可以使用递归解决这个问题呢?因为问题的规模可以进行拆解,大问题和小问题都是执行同样的操作,比如此时字符串1和字符串2它们0位置的元素都相等了,那么我们同时向后移动,去判断下一个位置是否相同。
  3. 以上就是该题目的求解思路,我们来一起看一下具体实现的代码。

🥦 实现代码

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        char[] arr1=text1.toCharArray();
        char[] arr2=text2.toCharArray();
        return process(0,0,arr1,arr2);
    }

    public int process(int i,int j,char[] arr1,char[] arr2){
        if(i>=arr1.length||j>=arr2.length) return 0;
        if(arr1[i]==arr2[j]){
            return process(i+1,j+1,arr1,arr2)+1;
        }
        return Math.max(process(i+1,j,arr1,arr2),process(i,j+1,arr1,arr2));
    }
}

🥦 运行结果

不出我们所料,超出时间限制,怎么办呢?各位看官,不要紧,我们继续向下看。

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 根据我们递归的分析,在递归的过程中会产生重复的子过程,所以我们想到了加一个缓存表,也就是我们的记忆化搜索。

🥦 实现代码

class Solution {
    int[][] dp;
    public int longestCommonSubsequence(String text1, String text2) {
        char[] arr1=text1.toCharArray();
        char[] arr2=text2.toCharArray();
        int n=arr1.length,m=arr2.length;
        dp=new int[n][m];
        for(int i=0;i<n;i++) Arrays.fill(dp[i],-1);
        return process(0,0,arr1,arr2);
    }

    public int process(int i,int j,char[] arr1,char[] arr2){
        if(i>=arr1.length||j>=arr2.length) return 0;
        if(dp[i][j]!=-1) return dp[i][j];
        if(arr1[i]==arr2[j]){
            return dp[i][j]=process(i+1,j+1,arr1,arr2)+1;
        }
        return dp[i][j]=Math.max(process(i+1,j,arr1,arr2),process(i,j+1,arr1,arr2));
    }
}

🥦 运行结果

我们可以看到,此时的记忆化搜索已经通过了!!!
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 按照我们之前递归和记忆化搜索的思路,通过动态规划实现出来。

🥦 实现代码

class Solution {
    int[][] dp;
    public int longestCommonSubsequence(String text1, String text2) {
        char[] arr1=text1.toCharArray();
        char[] arr2=text2.toCharArray();
        int n=arr1.length,m=arr2.length;
        dp=new int[n+1][m+1];
        for(int i=n-1;i>=0;i--){
            for(int j=m-1;j>=0;j--){
                if(arr1[i]==arr2[j]){
                    dp[i][j]=dp[i+1][j+1]+1;
                }else{
                    dp[i][j]=Math.max(dp[i+1][j],dp[i][j+1]);
                }
            }
        }
        return dp[0][0];
    }
}

🥦 运行结果

在这里插入图片描述



💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Springcloud连接nacos集群,nacos地址配置为nginx,报错:requst nacos server failed

先说下版本&#xff1a; Spring cloud&#xff1a; Hoxton.SR12 spring.cloud.alibaba&#xff1a; 2.2.9.RELEASE spring.boot&#xff1a; 2.3.12.RELEASE Linux Centos7 nacos-server&#xff1a;2.1.0 nginx&#xff1a; 1.20.2 环境说明&#xff1a; nacos正常搭建三个集…

Burpsuite双层代理以及抓https与app包设置

Burp Suite是一款用于Web应用程序安全测试的集成式平台。它由PortSwigger Ltd.开发&#xff0c;是一个功能强大的工具&#xff0c;用于发现Web应用程序的漏洞和安全问题&#xff0c;例如跨站点脚本&#xff08;XSS&#xff09;、SQL注入、会话劫持等。它包括多个模块&#xff0…

酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智慧酒厂酒业IP广播设计指南

酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智酒业酒厂IP广播系统设计指南 由北京海特伟业任洪卓发布于2023年4月25日 一、酒厂酒业IP网络广播系统建设需求 随着中国经济的快速稳步发展&#xff0c;中国白酒行业也迎来了黄金时期&#xff0c;产品规模、销售业绩等…

NLP 与 Python:构建知识图谱实战案例

概括 积累了一两周&#xff0c;好久没做笔记了&#xff0c;今天&#xff0c;我将展示在之前两周的实战经验&#xff1a;如何使用 Python 和自然语言处理构建知识图谱。 网络图是一种数学结构&#xff0c;用于表示点之间的关系&#xff0c;可通过无向/有向图结构进行可视化展示…

【2023团体程序设计天梯赛CCCC】GPLT2023,L1~L2部分(PTA,L1-089~L1-096,L2-045~L2-048)题解代码复盘

文章目录 概要L1-089 最好的文档 5L1-090 什么是机器学习 5L1-091 程序员买包子 10L1-092 进化论 10L1-093 猜帽子游戏 15L1-094 剪切粘贴 15L1-095 分寝室 20L1-096 谁管谁叫爹 20L2-045 堆宝塔 25L2-046 天梯赛的赛场安排L2-047 锦标赛 25L2-048 寻宝图 25L3-035 完美树&…

GIII EDI 需求分析

G-III成衣集团是一家美国服装公司&#xff0c;拥有30多个授权和自有品牌如&#xff1a;Calvin Klein、Tommy Hilfiger、Guess以及Levi’s等&#xff0c;在全球拥有众多的零售合作伙伴和销售渠道&#xff0c;并致力于提供时尚、高质量和价格合理的服装产品。 GIII EDI 需求 传…

版本控制工具之Git基本操作

Git 相对较新的版本控制工具&#xff0c;特点为分布式。 每一台客户端都具有完整的版本备份&#xff0c;所有的版本提交都不需要依赖中心服务器。只有在多人协同时&#xff0c;服务器会处理并发情况。 一、Git 环境安装 &#x1f449;链接&#xff1a;https://blog.csdn.net/w…

「速通Shell」初次走近Shell,Shell是什么?

目录 初次走进ShellShell是什么Shell工作原理 Shell分类Shell的优势 第一个Shell脚本Hello WorldShell执行方式绝对路径执行相对路径执行脚本命令执行系统命令执行 总结 对于开发者来说&#xff0c;除了掌握Java、C/C等主要编程语言外&#xff0c;还需要掌握支撑性的工具语言和…

Vagrant 安装

系列文章目录 文章目录 系列文章目录前言一、安装地址二、安装步骤注意事项三、常用命令四、问题总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内…

机器人方向的人工智能工具是助手还是平替

本文内容严格按创作模板发布&#xff1a; 近日育碧开发了人工智能工具 Ghostwriter&#xff0c;可以一键生成游戏NPC对话。不少游戏开发者担心AI写手工具的出现会让自己“饭碗”不保&#xff0c;但Swanson表示这个工具只是为了提供第一稿的 barks来减少对话生成工作的繁琐度。…

Linux网络编程TCP粘包问题解析及解决方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、一次发送多个数据实验二、导致问题的原因三、解决方案之一&#xff1a;延时发送四、知识点补充发送缓冲区和接收缓冲区五、解决方法总结 前言 本篇文章将引…

Java-JDK动态代理(AOP)使用及实现原理分析

Java-JDK动态代理&#xff08;AOP&#xff09;使用及实现原理分析 第一章:代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 后面我们在用Spirng和Mybatis的时候,要理解怎么使用的. 1.什么是代理? 代理…

PID循迹机器人及整定

如何对线路循迹机器人进行编程 如何对线路循迹机器人进行编程 (robotresearchlab.com)PID调谐文章&#xff1a;http://robotresearchlab.com/2019/02/16/pid-line-follower-tuning/ 介绍人们选择对循迹机器人进行线路编程的两种主要方式&#xff0c;并比较两者。将详细比较“…

绘声绘影2023简体中文版新功能介绍

会声会影是一款专业的数字音频工作站软件,它提供强大的音频编辑和制作功能,被广泛应用于音乐创作、录音棚录制以及现场演出等领域。会声会影的最新版本会声会影2023将于2022年底发布,主要功能和新功能详述如下: 会声会影2023主要功能: 1. 直观易用的界面:会声会影采用简洁而不…

C语言入门篇——数组篇

目录 1、数组 2、一维数组的创建和初始化 2.1数组的创建方式&#xff1a; 2.2数组的初始化 2.3一维数组的使用 ​2.4一维数组在内存中的存储 3、二维数组的创建和初始化 3.1二维数组的创建 3.2二维数组的初始化 3.3二维数组的使用 3.4二维数组在内存中的存储 4、数组…

SpringBoot中一个注解优雅实现重试Retry框架

目录: 1、简介2、实现步骤 1、简介 重试&#xff0c;在项目需求中是非常常见的&#xff0c;例如遇到网络波动等&#xff0c;要求某个接口或者是方法可以最多/最少调用几次&#xff1b;实现重试机制&#xff0c;非得用Retry这个重试框架吗&#xff1f;那肯定不是&#xff0c;相信…

【云计算•云原生】2.云计算环境下的新趋势—云原生

文章目录 1.什么是云原生2.云原生概述2.1 微服务2.2 容器云2.3 serverless无服务器2.4 DevOps2.5 持续集成和持续交付2.6 openStack 1.什么是云原生 按照自己的理解&#xff0c;可以将云原生拆分成云原生&#xff0c;云就是上一节中的云计算的云&#xff1b;原生即为诞生的环境…

Visual Studio C# WinForm开发入门(3):各种控件介绍

1、窗体 窗口就是打开程序我们所面对的一个面板&#xff0c;里面可以添加各种控件&#xff0c;如下图所示&#xff0c;我们可以在属性栏设置其标题名称、图标、大小等。 双击标题框&#xff0c;会生成Load函数&#xff0c;也可以到事件里面去找 Load函数是窗口生成后需要…

Spring Doc OpenAPI3.0 抛弃SpringFox拥抱SpringDoc

Spring Doc 1 简介 SpringDoc是SpringBoot 的API文档工具。官网&#xff1a;https://springdoc.org/ 在使用SpringBoot 2.6以前去创建API文档工具一般会采用SpringFox提供的Swagger库&#xff0c;但是由于SpringBoot版本的不断升级和SpringFox摆烂不更新&#xff0c;导致了S…

springboot项目需要读取非application.yml/properties 的配置文件

目录&#xff1a; 1、操作步骤2、总结3、扩展4、第二种方法获取配置文件bean 1、操作步骤 1.新建配置文件&#xff1a; 2.编辑配置文件&#xff1a; test-serverrd-dev02.jr.rong360.com3.新建Config类&#xff1a; Component PropertySource(value "kirara.properti…