1143. 最长公共子序列(C++实现)

news2024/12/24 2:46:06

1143. 最长公共子序列icon-default.png?t=N7T8https://leetcode.cn/problems/longest-common-subsequence/

int longestCommonSubsequence(string text1, string text2) {

	int m = text1.size(), n = text2.size();
		
	vector<vector<int>> dp(m + 1, vector<int>(n + 1));

	for (int i = 0; i < m; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			if (text1[i] == text2[j])
			{
				dp[i + 1][j + 1] = 1 + dp[i][j];
			}
			else
			{
				dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
			}
		}
	}

	return dp[m][n];
}

BM65 最长公共子序列(二)

题目改成求最长公共子序列的同时、要输出这个子序列;

如果使用 vector<vector<string>> 作为dp数组的话,空间复杂度将会达到O(n三次方);

因此这里多用一个 vector<vector<int>> 来记录最长公共子序列的遍历路径,当遍历完成后、再根据这个路径来输出结果子序列。

string LCS(string s1, string s2) {

    int m = s1.size(), n = s2.size();
    
    vector<vector<int>> dp(m + 1, vector<int>(n + 1));
    vector<vector<pair<int, int>>> pre(m + 1, vector<pair<int, int>>(n + 1));

    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (s1[i] == s2[j])
            {
                dp[i + 1][j + 1] = 1 + dp[i][j];
                pre[i + 1][j + 1] = {i, j};
            }
            else
            {
                if (dp[i][j + 1] > dp[i + 1][j])
                {
                    dp[i + 1][j + 1] = dp[i][j + 1];
                    pre[i + 1][j + 1] = {i, j + 1};
                }
                else
                {
                    dp[i + 1][j + 1] = dp[i + 1][j];
                    pre[i + 1][j + 1] = {i + 1, j};
                }
            }
        }
    }

    if (dp[m][n] == 0)
    {
        return "-1";
    }

    string res;
    int i = m, j = n;
    while (i != 0 && j != 0)
    {
        if (s1[i - 1] == s2[j - 1])
        {
            res = s1[i - 1] + res;
        }
        
        pair<int, int> temp = pre[i][j];
        i = temp.first;
        j = temp.second;
    }

    return res;
}

 坑:

最后的

pair<int, int> temp = pre[i][j];
i = temp.first;
j = temp.second;

不能写成

i = pre[i][j].first;

j = pre[i][j].second;        // 此时 i 已被改变

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

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

相关文章

C++文件操作示例

C 标准库提供了 3 个类用于实现文件操作&#xff0c;它们统称为文件流类&#xff0c;这 3 个类分别为&#xff1a; ifstream&#xff1a;专用于从文件读取数据 ofstream&#xff1a;专用于向文件写入数据 fstream&#xff1a;可读可写 这三个文件流类都位于 fstrea…

NSS [HNCTF 2022 WEEK2]easy_sql

NSS [HNCTF 2022 WEEK2]easy_sql 这题考察了无列名注入&#xff0c;首先了解一下什么是无列名注入再开始做题吧。 为什么会需要无列名注入&#xff1f; 我们常用的SQL注入方法是通过information_schema这个默认数据库来实现&#xff0c;可是你有没有想过&#xff0c;如果过滤…

下载github中单独某个子文件方法

在github中下载文件有很多方法&#xff0c;比如整体打包下载&#xff0c;单独小文件下载。我分享一个怎样下载某个单独文件夹方法。 在下载这个E文件夹时候&#xff0c;复制当前的url。 然后找到一个工具网页&#xff1a;DownGit 然后就可以下载文件夹的压缩文件了。

【机器学习】TF-IDF以及TfidfVectorizer

TF-IDF定义 TF-IDF&#xff1a; 全称为"词频一逆文档频率"。   TF&#xff1a;某一给定词语在该文档中出现的频率。 T F w 词语 w 在该文档中个数 该文档内总词个数 TF_w \frac{词语w在该文档中个数}{该文档内总词个数} TFw​该文档内总词个数词语w在该文档中个…

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关的SIP中继8、设置FXO网关呼叫…

第二章 进程与线程 十、调度算法1(先来先服务、短作业优先、最高响应比优先)

目录 一、先来先服务算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺点 优点&#xff1a; 缺点&#xff1a; 6、是否会导致饥饿 7、例子 二、短作业优先算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺…

Linux多线程【线程控制】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、线程知识补充1.2、线程私有资源1.3、线程共享资源1.4、原生线程库 2、线程…

FreeSWITCH 1.10.10 简单图形化界面8 - 讯时FXO网关SIP注册公网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面8 - 讯时FXO网关SIP注册公网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX 分机中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关中继线路呼入号码7、设置FXO网关呼叫路由&#xff08;呼入…

为啥我的第二个for循环不加框红的代码就运行失效呢?(文末赠书)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 苟全性命于乱世&#xff0c;不求闻达于诸侯。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【哎呦喂 是豆子&#xff5e;】问了一…

【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示

2.1 无符号数和有符号数 2.1.1 无符号数 没有符号的数&#xff0c;其实就是非负数。在计算机中用字节码表示&#xff0c;目前最常用的是八位和十六位的。 2.1.2 有符号数 将正负符号数字化&#xff0c;0代表 &#xff0c;1代表 - &#xff0c;并把代表符号的数字放在有效数…

【Linux升级之路】6_进程间通信

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux升级之路】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量 &#x1f…

八股文学习一(存储)

一. 存储 行式存储的原理与特点 对于 OLAP 场景&#xff0c;大多都是对一整行记录进行增删改查操作的&#xff0c;那么行式存储采用以行的行式在磁盘上存储数据就是一个不错的选择。 当查询基于需求字段查询和返回结果时&#xff0c;由于这些字段都埋藏在各行数据中&#xf…

直播设备之ENC1高级篇拆机刷uboot教程

直播设备之ENC1高级篇拆机刷uboot教程 第一步&#xff1a; 准备材料第二步&#xff1a;拆外壳取出裸板第三步&#xff1a;链接串口线第四步&#xff1a;进入电脑&#xff0c;开始刷uboot第五步&#xff1a;开始刷设备固件 老铁们好&#xff0c;好久没出文章了&#xff0c;这两天…

【面试题】智力题

文章目录 腾讯1000瓶毒药里面只有1瓶是有毒的&#xff0c;问需要多少只老鼠才能在24小时后试出那瓶有毒。有两根不规则的绳子&#xff0c;两根绳子从头烧到尾均需要一个小时&#xff0c;现在有一个45分钟的比赛&#xff0c;裁判员忘记带计时器&#xff0c;你能否通过烧绳子的方…

leetcode21合并两个有序链表

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

Android之MediaMetricsService实现本质(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

AE-如何让一副静止的画变成动态图

如何让一副静止的画变成动态图,如图所示,如何让图中静态的芦苇随风摆动? 制作过程如下: 1.安装AutoSway AutoSway 可以从lookae 下载。 AutoSway 安装方法: 1)复制 AutoSway.jsxbin和AutoSway_ffx文件夹到AE脚本目录: Win:...Adobe After Effects CC\Support Fil…

【SDXL_LORA模型训练详细教程(含云端教程)】

个人网站&#xff1a;https://tianfeng.space 一、前言 之前写过一篇SD1.5 LORA模型的炼制方法&#xff0c;有的人想要我详细点说说秋叶启动器的lora训练器&#xff0c;SDXL建议使用秋叶的训练器&#xff0c;SD1.5赛博丹炉&#xff0c;个人习惯仅供参考&#xff01;这次基于s…

TCP详解之滑动窗口

TCP详解之滑动窗口 引入窗口概念的原因 我们都知道 TCP 是每发送一个数据&#xff0c;都要进行一次确认应答。当上一个数据包收到了应答了&#xff0c; 再发送下一个。 这个模式就有点像我和你面对面聊天&#xff0c;你一句我一句。但这种方式的缺点是效率比较低的。 如果你…

红黑树的原理

文章目录 红黑树的原理红黑树的定义为什么会有红黑树红黑树构建 红黑树的原理 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它在计算机科学中被广泛应用于实现有序集合和映射等数据结构。它通过引入颜色标记和一些特定的操作规则&#…