LeetCode 热题 100 | 多维动态规划(二)

目录

1  5. 最长回文子串

2  1143. 最长公共子序列


菜鸟做题,语言是 C++

1  5. 最长回文子串

核心思想:把总问题拆解为若干子问题。

  • 总问题:从第 i 个字母到第 j 个字母是回文串
  • 子问题:从第 i + 1 个字母到第 j - 1 个字母是回文串、第 i 个字母等于第 j 个字母
  • 总问题 = 子问题 1 + 子问题 2

思路说明图:如下图所示,要使 “从第 i 个字母到第 j 个字母是回文串”,必须满足 “从第 i + 1 个字母到第 j - 1 个字母是回文串” 和 “第 i 个字母等于第 j 个字母” 这两个条件。

很自然地想到设置一个 dp 二维数组,其中的 dp[i][j] 用于记录 “从第 i 个字母到第 j 个字母” 是否是回文串。如果是,则 dp[i][j] = 1;否则,dp[i][j] = 0 。

最初可能会想到这样写循环:

for (int i = 0; i < n; ++i) {for (int j = i; j < n; ++j) {dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];}
}

但问题在于,当我们计算 dp[i][j] 的时候,dp[i + 1][j - 1] 还没有被算出来。

因此,我们把 “从前往后” 遍历改为 “从后往前” 遍历:

for (int i = n - 1; i >= 0; ++i) {for (int j = i; j < n; ++j) {dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];}
}

由于 i = n - 1 会导致 dp[i + 1][j - 1] 访问越界,因此我们还会加入一些判断条件。

class Solution {
public:string longestPalindrome(string s) {int n = s.size();if (n < 2) return s;vector<vector<int>> dp(n, vector<int>(n, 0));string ans;for (int i = n - 1; i >= 0; --i) {for (int j = i; j < n; ++j) {if (i + 1 <= j - 1) {dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];} else {dp[i][j] = s[i] == s[j];}if (dp[i][j] && s.substr(i, j - i + 1).size() > ans.size())ans = s.substr(i, j - i + 1);}}return ans;}
};

说明:if (i + 1 <= j - 1) 是在判断什么?

上图给出了 “i 和 j 之间没有夹子串” 的两种情况,我们直接判断 s[i] 和 s[j] 是否相等即可。

2  1143. 最长公共子序列

核心思想:把总问题拆解为若干子问题。

  • 总问题:text1 前 i 个字母和 text2 前 j 个字母有多少个相同
  • 子问题:text1 前 i/i-1 个字母和 text2 前 j-1/j 个字母有多少个相同
  • 总问题 = 子问题 1 + 子问题 2

思路说明图:设置一个 dp 二维数组,其中 dp[i][j] 代表 text1 前 i 个字母和 text2 前 j 个字母的相同个数。假设 text1[i] 和 text2[j] 不同,那么 dp[i][j] 只能从 dp[i][j - 1] 和 dp[i - 1][j] 中继承一个,由于是在求最长,因此继承二者中的较大者。

如果 text1[i] 和 text2[j] 相同,则 dp[i][j] = dp[i - 1][j - 1] + 1,而不能从 dp[i][j - 1] 和 dp[i - 1][j] 中继承,否则会导致 text1[i] 或 text2[j] 被重复使用。

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.size();int n = text2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (text1[i - 1] == text2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);}}}return dp[m][n];}
};

这里 dp 增加了一行和一列当哨兵,防止 dp[i - 1][j - 1] 等访问越界。相应地,在访问 text1 和 text2 字符串时 i 和 j 要减一,因为 text1 和 text2 是从 0 开始计数的。

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

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

相关文章

【Python基础】集合

文章目录 [toc]什么是集合集合的特点元素不重复性示例 无序性示例 集合操作增加元素add()方法 删除元素clear()方法pop()方法remove()方法 交集intersection()方法&符号isdisjoint()方法 并集union()方法|符号 差集difference()方法-符号 对称差集symmetric_difference()方…

配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

ZStack Cloud 5.0.0正式发布——Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强四大亮点简析

近日&#xff0c;ZStack Cloud 5.0.0正式发布&#xff0c;推出了包含Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强在内的一系列重要功能。云主机管理、物理机运维、密评合规、灾备服务等诸多使用场景和功能模块均有更新&#xff0c;为您带来更完善的平台服务、更…

设计模式——2_8 策略(Strategy)

文章目录 定义图纸一个例子&#xff1a;如何切换坦克的攻击方式GameElement&#xff08;游戏元素&#xff09;TankFactory&#xff08;坦克工厂&#xff09;Tank&#xff08;坦克&#xff09; 医疗车和飞行车策略模式Behavior(行为)TankTankFactory 碎碎念策略和状态为什么我们…

MySQL高级(索引语法、创建索引、查看索引、删除索引)

创建索引 create [unique | fulltext] index index_name on table_name (index_col_name,...); 查看索引 show index from table_name; 删除索引 drop index index_name on table_name; 案例演示&#xff1a; 先来创建一张表 tb_user&#xff0c;并且查询测试数据。 cre…

男女恋爱话术聊天对话回复矩阵版h5微信抖音QQ快手小程序app开发

男女恋爱话术聊天对话回复矩阵版h5微信抖音QQ快手小程序app开发 支持SAAS、支持独立加密、支持独立开源、价格不同。 买就送28W话术数据库 聊天神器 支持16种Al语气、男女版切换、矩阵运营、送后端转化渠道 支持微信公众号微信小程序抖音快手小程序可打包APP 这是一款什么软…

java开发的4套智慧系统源码 智慧校园系统源码 智慧工地系统源码 智慧城管系统源码

4套java智慧系统源码 智慧校园系统源码 智慧工地系统源码 智慧城管系统源码 3D 智能导诊系统源码 Java智慧校园系统源码 智慧学校源码 微信小程序电子班牌 智慧校园系统简介&#xff1a; 智慧校园的建设逐渐被师生、家长认可接受&#xff0c;智慧校园通过对在校师生、教务等…

MySQL学习笔记(数据类型, DDL, DML, DQL, DCL)

Learning note 1、前言2、数据类型2.1、数值类型2.2、字符串类型2.3、日期类型 3、DDL总览数据库/表切换数据库查看表内容创建数据库/表删除数据库/表添加字段删除字段表的重命名修改字段名&#xff08;以及对应的数据类型&#xff09; 4、DML往字段里写入具体内容修改字段内容…

MySQL学习笔记2——基础操作

基础操作 一、增删改查1、添加数据2、删除数据3、修改数据4、查询语句 二、主键三、外键和连接1、外键2、连接 一、增删改查 1、添加数据 INSERT INTO 表名[(字段名[,字段名]…)] VALUES (值的列表); --[]表示里面的内容可选添加数据分为插入数据记录和插入查询结果 插入数据…

Patreon是什么?如何用虚拟卡订阅Patreon上的艺术家?详细教程

Patreon是什么&#xff1f; Patreon 是目前世界上最受欢迎的会员平台之一。 它在过去几年中引起了不小的轰动&#xff0c;目前被全球的内容创作者所使用。 内容创作者和艺术家通常很难让粉丝在经济上支持他们。 通过使用像 Patreon 这样的平台&#xff0c;创作者和艺术家可以…

arcgis使用面shp文件裁剪线shp文件报错

水系数据裁剪&#xff0c;输出为空&#xff1a; ArcGIS必会的几个工具的应用 --提取、分割、融合、裁剪&#xff08;矢&#xff09;、合并、追加、镶嵌、裁剪&#xff08;栅&#xff09;、重采样_arcgis分割-CSDN博客 下面的方法都不行&#xff1a; ArcGIS Clip&#xff08;裁…

Linux 安装系统可视化监控工具 Netdata

目录 About 监控工具 NetdataLinux 系统安装 Netdata关于 openEuler1、查看内核信息2、查看主机信息3、查看 dnf 包管理器的版本 Netdata 安装1、更新系统环境相关 rpm 包2、查看 netdata 包信息3、安装 netdata 包4、编辑 netdata.conf 配置5、启动 netdata 服务6、查看 netda…

liunx环境变量学习总结

环境变量 在操作系统中&#xff0c;环境变量是一种特殊的变量&#xff0c;它们为运行的进程提供全局配置信息和系统环境设定。本文将介绍如何自定义、删除环境变量&#xff0c;特别是对重要环境变量PATH的管理和定制&#xff0c;以及与环境变量相关的函数使用。 自定义环境变…

李廉洋:4.9黄金屡创新高。黄金原油晚间最新分析建议。

但当下不管是战争因素所带来的避险情绪影响还是美国降息与否所带来的经济影响都无疑还是支撑着黄金继续走高&#xff0c;那么接下来&#xff0c;只要市场不出现较大的利空影响&#xff0c;黄金都不会有较大的回调力度&#xff0c;所以我们当下不管是短线还是长线仍旧以继续看多…

基于SSM+Jsp+Mysql的物流管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

到底有什么是 Node.js 无法实现的?

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它使得 JavaScript 能够脱离浏览器在服务器端运行。Node.js 以其非阻塞 I/O 和事件驱动的特性而广受欢迎&#xff0c;尤其在构建快速、可伸缩的网络应用方面表现出色。然而&#xff0c;尽管 Node.js 非常强…

定制一套ERP系统怎么样?大概要多少钱?

定制一套ERP系统怎么样&#xff1f;大概要多少钱&#xff1f;这篇内容3000字&#xff0c;纯手打。全部都是我们9年来沉淀的实际经验。 作为有9年系统定制开发经验的乙方厂商&#xff0c;定制ERP系统可以粗略划分为3个方向&#xff1a; ERP管理系统模板&#xff0c;可直接查看和…

MySQL中数据库、表的操作

文章目录 一、管理数据库1.1、连接数据库1.2、创建库1.3、选择数据库1.4、修改数据库名称1.5、查看数据库信息1.6、删除库 二、定义数据表字段2.1、数据表字段的数据类型2.2、数据表字段属性2.3、约束讲解2.3.1、约束的定义1&#xff09;为什么需要约束2&#xff09;什么是约束…

Matplotlib实现数据可视化

Matplotlib是Python中应用较为广泛的绘图工具之一&#xff0c;首次发布于2007年。它在函数设计上参考了MATLAB&#xff0c;因此名字以"Mat"开头&#xff0c;中间的"plot"代表绘图功能&#xff0c;结尾的"lib"表示它是一个集合。Matplotlib支持众…