【LeetCode】1143. 最长公共子序列

1.问题

给定两个字符串 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 仅由小写英文字符组成。

2.解题思路

2.1 动态规划

定义dpij表示text1的前i-1个字符和text2 的前j-1个字符所能形成的最长公共子序列的长度。
令len1为text1 的总长,len2为text2 的总长,则dplen1,len2 即为题目所求。

  • 当 i=0 时,text1 [0:i] 为空,空字符串和任何字符串的最长公共子序列的长度都是 0,因此对任意 0≤j≤len2,有 dp0,j=0;

  • 当 j=0 时,text2[0:j] 为空,同理可得,对任意 0≤i≤len1,有 dp[i][0]=0。

因此动态规划的边界情况是:当 i=0 或 j=0 时,dpi,0=0。

  • 当 i>0 且 j>0 时,考虑 dpij的计算:

    • 当 text1[i−1] = text2[j−1] 时,将这两个相同的字符称为公共字符,考虑 text1[0:i−1] 和 text2[0:j−1] 的最长公共子序列,再增加一个字符(即公共字符)即可得到 text1[0:i] 和 text2[0:j] 的最长公共子序列,因此 dpij=dpi-1,j-1+1。

    • 当 text1[i−1]≠text2[j−1] 时,考虑以下两项:

      • text1[0:i−1] 和 text2[0:j] 的最长公共子序列;

      • text1[0:i] 和 text2[0:j−1] 的最长公共子序列。

      要得到 text1[0:i] 和 text2[0:j] 的最长公共子序列,应取两项中的长度较大的一项,因此 dpij==max⁡(dpi−1,j, dpi,j−1)。

由此可以得到如下状态转移方程:

  • 当text1[0:i-1]=text2[0:j-1], dpi,j =dpi-1,j-1 +1;
  • 否则,dpi,j =max{dpi,j-1 , dpi-1,j }

最终,dplen1,len2 即为text1 和 text2 的最长公共子序列。

例如,text1 =abcddab, text2 =bdcaba,则动态规划矩阵如下图:

在这里插入图片描述

3.代码

class Solution {
    /**
动态规划(利用偏移)
上述「追加空格」的做法是我比较习惯的做法 🤣

事实上,我们也可以通过修改「状态定义」来实现递推:

f[i][j] 代表考虑 s1 的前 i−1 个字符、考虑 s2 的前 j−1 的字符,形成的最长公共子序列长度。

那么最终的 f[n][m] 就是我们的答案,f[0][0] 当做无效值,不处理即可。

s1[i-1]==s2[j-1] : f[i][j]=f[i−1][j−1]+1。代表使用 s1[i−1] 与 s2[j−1] 形成最长公共子序列的长度。
s1[i-1]!=s2[j-1] : f[i][j]=max(f[i−1][j],f[i][j−1])。代表不使用 s1[i−1] 形成最长公共子序列的长度、不使用 s2[j−1] 形成最长公共子序列的长度。这两种情况中的最大值。

作者:宫水三叶
链接:https://leetcode.cn/problems/longest-common-subsequence/solutions/697187/gong-shui-san-xie-zui-chang-gong-gong-zi-xq0h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    */
    public int longestCommonSubsequence(String text1, String text2) {
        char[] t1 = text1.toCharArray();
        char[] t2 = text2.toCharArray();
        int length1 = t1.length;
        int length2 = t2.length;
        int[][] dp = new int[length1+1][length2+1];
        for (int i = 1; i < length1 +1; i++) {
            for (int j = 1; j < length2 +1; j++) {
                if (t1[i-1] == t2[j-1]){
                    // 这边找到一个 lcs 的元素,继续往前找
                    dp[i][j] = 1+ dp[i-1][j-1];
                }else {
                    //谁能让 lcs 最长,就听谁的
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[length1][length2];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么让chatGTP写论文-chatGTP写论文工具

chatGTP如何写论文 ChatGPT是一个使用深度学习技术训练的自然语言处理模型&#xff0c;可以用于生成自然语言文本&#xff0c;例如对话、摘要、文章等。作为一个人工智能技术&#xff0c;ChatGPT可以帮助你处理一些文字内容&#xff0c;但并不能代替人类的创造性思考和判断。以…

手机录屏怎么操作?有哪些好用的方法

在现代科技的时代&#xff0c;手机录屏已经成为了常见的操作。这项技术允许我们在手机上录制视频并分享给他人。但是&#xff0c;很多人可能并不知道如何进行手机录屏。下面我们将介绍手机录屏的操作方法和一些值得推荐的工具。 手机录屏操作方法 对于iOS用户&#xff0c;可以…

Ribbon负载均衡

目录 1.Ribbon负载均衡 1.1.负载均衡原理 1.2.源码跟踪 1&#xff09;LoadBalancerIntercepor 2&#xff09;LoadBalancerClient 3&#xff09;负载均衡策略IRule 4&#xff09;总结 1.3.负载均衡策略 1.3.1.负载均衡策略 1.3.2.自定义负载均衡策略 1.4.饥饿加载 1.R…

InnoDB 与MyISAM 的区别

MyISAM和InnoDB都是Mysql里面的两个存储引擎。 在Mysql里面&#xff0c;存储引擎是可以自己扩展的&#xff0c;它的本质其实是定义数据存储的方式以及数据读取的实现逻辑。 不同存储引擎本身的特性&#xff0c;使得我们可以针对性的选择合适的引擎来实现不同的业务场景。从而获…

Java企业级信息系统开发01—采用spring配置文件管理bean

文章目录 一、Web开发技术二、spring框架&#xff08;一&#xff09;spring官网&#xff08;二&#xff09;spring框架优点&#xff08;三&#xff09;Spring框架核心概念1、IoC&#xff08;Inversion of Control&#xff09;和容器2、AOP&#xff08;Aspect-Oriented Programm…

间谍软件开发商利用漏洞利用链攻击移动生态系统

导语&#xff1a;间谍软件开发商结合使用了零日漏洞和已知漏洞。谷歌TAG的研究人员督促厂商和用户应加快给移动设备打补丁的步伐。 间谍软件开发商利用漏洞利用链攻击移动生态系统去年&#xff0c;几家商业间谍软件开发商开发并利用了针对 iOS 和安卓用户的零日漏洞。然而&…

【Python】什么是爬虫,爬虫实例

有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…

stream的collectors

起因的话&#xff0c;新进公司&#xff0c;看见了一段有意思的代码。 public final class MyCollectors {private MyCollectors() {}static final Set<Collector.Characteristics> CH_ID Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_F…

从点赞到数字货币:揭秘Diem币与Facebook的联系

大家都知道Facebook是一个全球知名的社交媒体平台&#xff0c;但你是否听说过与Facebook有关的数字货币Diem币呢&#xff1f;或许你会想&#xff0c;从点赞到数字货币&#xff0c;这是怎么回事&#xff1f;别着急&#xff0c;让我们一起揭秘Diem币与Facebook的联系。 首先&…

rk平台调试音频(从驱动到apk)

需要实现的功能&#xff1a; 输入&#xff1a;hdmiin、uvc、mic可以实时切换 输出&#xff1a;耳机和HDMI OUT同时输出声音 这里注意&#xff1a;mic是存在hedset情况&#xff0c;4节耳机&#xff0c;即可输出又可输出同时进行 开发情况&#xff1a; 一、先熟悉大致的Andro…

ArcMap最短路径分析和网络数据集的构建

打断相交点 1.单击【编辑器】工具条上的编辑工具。 2.选择要在交叉点处进行分割的线要素。 3.单击【高级编辑】工具条上的打断相交线工具。 4.默认或可输入拓扑容差。 5.单击确定。 结果:所选线在相交处分割为多个新要素。“打断”操作还会移除叠置的线段-例如&#xff0…

怎么控制别人的电脑屏幕?

为什么需要控制别人的屏幕&#xff1f; 我们不可避免地会遇到一些情况&#xff0c;比如我们需要为我们的朋友、同事或家人提供有关 IT 相关问题的帮助&#xff0c;如果他们不知道它该怎么处理这些问题该怎么办呢&#xff1f; 这时&#xff0c;我们可能需要用我们的电脑…

测试20K要什么水平?25岁测试工程师成功斩下offer(附面试题)

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我是一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0c;早已看透了面试官…

三维数据学习笔记:ply数据内容介绍

目录 前言1. 三维数据的组成1.1 点云数据1.2 网格数据 2. ply数据内容2.1 属性2.1.1 文本描述属性2.1.2 数据描述属性2.1.2.1 顶点(vertex)2.1.2.2 面(face)2.1.2.3 相机(camera) 2.2 数据2.2.1 顶点(vertex)2.2.2 面(face)2.2.3 相机(camera) 3. 示例3.1 示例13.2 示例2 前言 …

Java基础(十七)File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1&#xff0c;同步也增加了许多新的方法&#xff0c;主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIn…

DolphinScheduler 3.1.4详细教程

文章目录 第一章 DolphinScheduler介绍1.1 关于DolphinScheduler1.2 特性1.3 名词解释1.3.1 名词解释1.3.2 模块介绍 第二章 DolphinScheduler系统架构2.1 系统架构图2.2 架构说明该服务包含&#xff1a; 2.3 启动流程活动图2.4 架构设计思想2.4.1 去中心化vs中心化2.4.1.1 中心…

北京地铁:充分发挥数据价值,全面提升业财融合能力

4月19日-4月21日&#xff0c;一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园&#xff0c;了解最新技术发展趋势、探讨行业热点话题。会上&#xff0c;北京地铁运营有限公司&#xff08;以下简称“北京地铁…

使用 ChatGPT 辅助学习——为自己找一个老师

我们每个人都有许多标签&#xff0c;例如高中生、成绩中等、文科&#xff0c;根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师&#xff0c;这可以带来效率上的提升&#xff0c;因为同一份教程、老师就可以服务几十上百人&#xff0c;而无须为每个人定制&…

2023年腾讯云轻量服务器性能评测

腾讯云轻量应用服务器性能评测 轻量应用服务器是腾讯云推出的一款开箱即用的轻量级的云服务器&#xff0c;轻量服务器CPU内存带宽配置更高&#xff0c;价格却又很便宜&#xff0c;很多同学认为是不是轻量应用服务器性能不行呀&#xff0c;轻量服务器和云服务器有什么区别&…