leetcode-最长公共子序列(二)-103

题目要求
在这里插入图片描述

思路
step 1:优先检查特殊情况。
step 2:获取最长公共子序列的长度可以使用动态规划,我们以dp[i][j]dp[i][j]dp[i][j]表示在s1中以iii结尾,s2中以jjj结尾的字符串的最长公共子序列长度。
step 3:遍历两个字符串的所有位置,开始状态转移:若是iii位与jjj位的字符相等,则该问题可以变成1+dp[i−1][j−1]1+dp[i-1][j-1]1+dp[i−1][j−1],即到此处为止最长公共子序列长度由前面的结果加1。
step 4:若是不相等,说明到此处为止的子串,最后一位不可能同时属于最长公共子序列,毕竟它们都不相同,因此我们考虑换成两个子问题,dp[i][j−1]dp[i][j-1]dp[i][j−1]或者dp[i−1][j]dp[i-1][j]dp[i−1][j],我们取较大的一个就可以了,由此感觉可以用递归解决。
step 5:但是递归的复杂度过高,重复计算了很多低层次的部分,因此可以用动态规划,从前往后加,由此形成一个表,表从位置1开始往后相加,正好符合动态规划的转移特征。
step 6:因为最后要返回该序列,而不是长度,所以在构造表的同时要以另一个二维矩阵记录上面状态转移时选择的方向,我们用1表示来自左上方,2表示来自左边,3表示来自上边。
step 7:获取这个序列的时候,根据从最后一位开始,根据记录的方向,不断递归往前组装字符,只有来自左上的时候才添加本级字符,因为这种情况是动态规划中两个字符相等的情况,字符相等才可用。
代码实现

class Solution {
  public:
    string x = "";
    string y = "";
    string LCS(string s1, string s2) {
        if (s1.length() == 0 || s2.length() == 0)
            return "-1";
        int len1 = s1.length();
        int len2 = s2.length();
        x = s1;
        y = s2;
        vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));
        vector<vector<int>> b(len1 + 1, vector<int>(len2 + 1, 0));
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (s1[i - 1] == s2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    b[i][j] = 1;
                } else {
                    if (dp[i - 1][j] > dp[i][j - 1]) {
                        dp[i][j] = dp[i - 1][j];
                        b[i][j] = 2;
                    } else {
                        dp[i][j] = dp[i][j - 1];
                        b[i][j] = 3;
                    }
                }
            }
        }
        string res = ans(len1, len2, b);
        return res != "" ? res : "-1";
    }

    string ans(int i, int j, vector<vector<int>>& b) {
        string res = "";
        if (i == 0 || j == 0)
            return res;
        if (b[i][j] == 1) {
            res += ans(i - 1, j - 1, b);
            res += x[i - 1];
        } else if (b[i][j] == 2)
            res += ans(i - 1, j, b);
        else if (b[i][j] == 3)
            res += ans(i, j - 1, b);
        return res;
    }
};

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

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

相关文章

视频号小店从开店到爆单,最详细的攻略教学,来了!

大家好&#xff0c;我是喷火龙 视频号小店从推出到现在一直备受关注&#xff0c;我的团队已经入局视频号小店一年多了&#xff0c; 可以说&#xff0c;新手做视频号小店采用无货源模式和达人带货的玩法依旧是最合适的。 虽然说这个模式和玩法很多人之前都接触过&#xff0c;…

精准追踪,高效分析——Xinstall应用数据分析平台

在当前的移动互联网时代&#xff0c;App应用的数量与日俱增&#xff0c;如何从这些应用中脱颖而出&#xff0c;成为开发者和广告主们亟待解决的问题。而在这个问题中&#xff0c;数据无疑是一把关键的钥匙。今天&#xff0c;我们要介绍的就是国内专业的App全渠道统计服务商——…

普中STM32F103ZET6开发板让DS0和DS1两个LED同时亮

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.运行效果 一.前言 在这套stm32教程中,只教学了如何亮DS0,而没有教学如何亮DS1。 二.代码 main.c #include "stm32f10x.h"void Syst

Linux下Redis下载及安装教程(实测有效)

一、配置gcc 由于Redis是基于c语言编写的需要安装依赖,需要安装gcc&#xff0c;在Linux系统里需要存在C语言的编译环境&#xff0c;一般的Linux系统安装的时候会自动安装&#xff0c;由于我是最小安装模式&#xff0c;所以我需要自己再另外安装一下。 判断系统是否安装gcc&…

2024年Java程序员的职业发展路径

程序员的职业路径是非常清晰的&#xff0c;但是现实情况下&#xff0c;很多人卡在了高级开发就再也上不去&#xff0c;直到遇到职业发展的危机&#xff0c;比如&#xff1a; 35岁大龄程序员找工作难&#xff0c;国内很多大型互联网公司在招聘要求上&#xff0c;会限制35岁这个年…

PuLID: 图像背景、光线、风格等均保持高度一致图像生成工具,附本地一键包

PuLID是一种无需调优的ID定制方法。PuLID保持了高的ID保真度&#xff0c;同时有效地减少了对原始模型行为的干扰。 只需要提供一张照片&#xff0c;就可以生成高还原度的各种风格的图像。 使用方法&#xff1a;解压一键包&#xff0c;双击一键启动 点击ID图像&#xff08;主…

李国武:确保FMEA实现预期质量目标的方法有哪些?

在现代制造业中&#xff0c;FMEA&#xff08;失效模式与影响分析&#xff09;已经成为一项至关重要的质量管理工具。它通过对产品或过程进行系统的分析&#xff0c;识别潜在的失效模式&#xff0c;评估其影响&#xff0c;并制定相应的预防措施&#xff0c;从而确保产品或过程的…

Nginx 代理 MySQL 实现通过域名连接数据库

文章目录 Nginx 模块介绍Stream 模块配置远程连接 MySQLDataGrip 连接 MySQL Nginx 安装这里不做介绍。域名默认已经解析到服务器公网IP。 Nginx 模块介绍 HTTP 模块&#xff1a; HTTP模块提供了处理HTTP请求的功能&#xff0c;包括反向代理、负载均衡、缓存、HTTP代理等。 例…

Docker下载镜像出现“missing signature key”如何解决?

“missing signature key” 通常与 Docker 配置有关&#xff0c;具体是 Docker 试图验证镜像的签名但未能找到相应的密钥。这种情况可能发生在启用了 Docker Content Trust (DCT) 的环境中&#xff0c;DCT 是一种安全功能&#xff0c;要求所有镜像必须有签名才能拉取。 原因 …

资料同化 | 搭建docker环境-1

Community Gridpoint Statistical Interpolation (GSI) system DTC 是一个分布式设施&#xff0c;NWP 社区可以在这里测试和评估用于研究和操作的新模型和技术。 DTC的目标包括&#xff1a; 链接研究和操作社区 研究成果转化为实际操作的速度 加快改善天气预报 开发和测试有…

独享静态IP:跨境网络新助手

在数字化浪潮席卷全球的今天&#xff0c;互联网已成为人们生活中不可或缺的一部分。而在这个由数据和信息构成的虚拟世界里&#xff0c;IP地址作为每一个网络设备的独特标识&#xff0c;其重要性不言而喻。特别是独享静态IP&#xff0c;它不仅为用户提供了更加稳定、安全的网络…

在虚机VirtualBox7.0.8安装Androidx86_64系统详细步骤要点

最近需要用到安卓系统蓝牙功能做测试&#xff0c;就选择了Virtualboxandroidx86方案&#xff0c;先把系统安装好&#xff0c;后面看是否可以比较好的完成蓝牙功能测试。如果可以的话&#xff0c;我会再发文分享下的&#xff0c;敬请期待。 1.准备材料 &#xff08;1&#xff…

[数据集][目标检测]交通灯检测数据集VOC+YOLO格式2600张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2600 标注数量(xml文件个数)&#xff1a;2600 标注数量(txt文件个数)&#xff1a;2600 标注…

食家巷传统面点积极响应中国品牌日,打造国货潮牌

2024 年中国品牌日活动以“中国品牌&#xff0c;世界共享&#xff1b;国货潮牌&#xff0c;品筑未来”为主题&#xff0c;旨在推动中国品牌的发展和国际化&#xff0c;展示国货潮牌的魅力和创新。食家巷传统面点品牌积极响应活动号召&#xff0c;以实际行动助力中国品牌的崛起。…

PyQt5编写的一个简易图像处理软件

文章目录 1. 简介2. 准备工作3. 主界面设计4. 功能构建5. 总结 1. 简介 通过编写简易图像处理软件&#xff0c;你可以学习如何使用 PyQt5 构建用户界面&#xff0c;以及如何与用户交互。同时&#xff0c;你还可以学习图像处理技术&#xff0c;如图像读取、傅里叶变换、滤波、增…

ThinkPad T480(20L5,20L6)原装出厂Win10系统镜像下载

lenovo联想ThinkPad系列 T480笔记本电脑20L5、20L6原厂OEM预装Windows10系统&#xff0c;恢复开箱状态一模一样&#xff0c;带有恢复重置功能 链接&#xff1a;https://pan.baidu.com/s/1NqqBKC_v2mPDs2qTxsYvxA?pwdeivm 提取码&#xff1a;eivm 原装出厂系统自带所有驱动…

【机器学习】AI在空战决策中的崛起:从理论到实践的跨越

AI在空战决策中的崛起&#xff1a;从理论到实践的跨越 一、引言二、AI技术的崛起与空军决策技术层面作战结构 三、AI在空战决策中的前景展望四、结语 一、引言 随着科技的不断进步&#xff0c;现代战争已经步入了一个全新的时代。其中&#xff0c;空战作为战争的重要组成部分&a…

PG pageinspect使用与块空间清理学习

1.创建有时候会报错 ERROR: could not open extension control file "/usr/local/pgsql/share/extension/pageinspect.control": No such file or directory 解决方案&#xff1a; 2.使用 PostgreSQL中&#xff0c;对于每一行数据&#xff08;称为一个tuple&#…

caj文件是什么?caj是什么文件?考研学生赶紧收藏!

在学术研究的广阔领域中&#xff0c;尤其是对于那些致力于深入研究、不断拓宽知识边界的考研学子们来说&#xff0c;了解并掌握各种学术资源的获取与利用方法显得尤为重要。其中&#xff0c;CAJ文件作为一种常见的学术文件格式&#xff0c;其重要性和使用频率不容忽视。那么&am…

深度学习之激活函数——Tanh

Tanh 双曲正切1函数(tanh)&#xff0c;其图像与sigmoid函数十分相近&#xff0c;相当于sigmoid函数的放大版。在实际的使用中&#xff0c;tanh函数要优先于sigmoid函数。 函数表达式 t a n h e x − e − x e x e − x tanh\frac{e^x-e^{-x}}{e^xe^{-x}} tanhexe−xex−e−…