动态规划专训6——回文串系列

动态规划题目中,常出现回文串相关问题,这里单独挑出来训练

1.回文子串

LCR 020. 回文子串

给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串

1.状态表示:用dp[ i ][ j ]表示以 i 开始,j 结尾的子串是否是回文串

2.状态转移方程:dp[ i ][ j ] = s[ i ] == [ j ] && dp[ i + 1 ][ j - 1 ] 

3.初始化:无需初始化

4.填表顺序:从下往上填

5.返回值:dp表中ture的个数

class Solution {
public:int countSubstrings(string s) {int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));int ret = 0;for(int i = n - 1; i >= 0; --i)for(int j = i; j < n; ++j)if(s[i] == s[j]){dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;if(dp[i][j]) ++ret;}return ret;}
};

这是ac代码

2.最长回文子串

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串

1.状态表示:用dp[ i ][ j ]表示以 i 开始,j 结尾的子串是否是回文串

2.状态转移方程:dp[ i ][ j ] = s[ i ] == [ j ] && dp[ i + 1 ][ j - 1 ] 

3.初始化:无需初始化

4.填表顺序:从下往上填

5.返回值:最长回文子串

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

这是ac代码

3.分割回文串IV

1745. 分割回文串 IV

给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。

当一个字符串正着读和反着读是一模一样的,就称其为 回文字符串

1.状态表示:用dp[ i ][ j ]表示以 i 开始,j 结尾的子串是否是回文串

2.状态转移方程:dp[ i ][ j ] = s[ i ] == [ j ] && dp[ i + 1 ][ j - 1 ] 

3.初始化:无需初始化

4.填表顺序:从下往上填

5.返回值:据题目

class Solution {
public:bool checkPartitioning(string s) {int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));for(int i = n - 1;  i >= 0; --i)for(int j = i; j < n; ++j)if(s[i] == s[j])dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;for(int i = 1; i <= n - 2; ++i)for(int j = i; j <= n - 2; ++j)if(dp[0][i - 1] && dp[i][j] && dp[j + 1][n - 1])return true;return false;}
};

这是ac代码

4.分割回文串II

LCR 094. 分割回文串 II

给定一个字符串 s,请将 s 分割成一些子串,使每个子串都是回文串。

返回符合要求的 最少分割次数

1.状态表示:用dp[ i ]表示以 i 位结尾,是每个子串都是回文串的最少分割次数

2.状态转移方程:dp[ i ] = min(dp[ i ], dp[ j - 1 ] + 1);

3.初始化:全部初始化为INT_MAX

4.填表顺序:从左往右填

5.返回值:dp[ n  - 1]

class Solution {
public:int minCut(string s) {int n = s.size();vector<vector<bool>> arr(n, vector<bool>(n));for(int i = n - 1; i >= 0; --i)for(int j = i; j < n; ++j)if(s[i] == s[j])arr[i][j] = i + 1 < j ? arr[i + 1][j - 1] : true;vector<int> dp(n, INT_MAX);for(int i = 0; i < n; ++i){if(arr[0][i]) dp[i] = 0;else {for(int j = 0; j <= i; ++j)if(arr[j][i])dp[i] = min(dp[i], dp[j - 1] + 1);} }return dp[n - 1];}
};

这是ac代码

5.最长回文子序列

516. 最长回文子序列

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列

1.状态表示:用dp[ i ][ j ]表示以 i 开始,j 结尾的最长回文子序列的长度

2.状态转移方程:

                if (s[ i ] == s[ j ]) dp[ i ][ j ]  = 2 + dp[ i + 1 ][ j - 1 ] ;

                else dp[ i ][ j ] = max(dp[ i + 1 ][ j ], dp[ i ][ j - 1 ]);

3.初始化:无需初始化

4.填表顺序:每一行从上往下,每一列从左往右

5.返回值:dp[ 0 ][ n - 1 ]

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

这是ac代码

6.让字符串成为回文串的最少插入次数

1312. 让字符串成为回文串的最少插入次数

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。

请你返回让 s 成为回文串的 最少操作次数 。

「回文串」是正读和反读都相同的字符串

1.状态表示:用dp[ i ][ j ]表示以 i 开始,j 结尾的最少插入次数

2.状态转移方程:

                if (s[ i ] == s[ j ]) dp[ i ][ j ] = dp[ i + 1 ][ j - 1 ];

                else dp[ i ][ j ] = min(dp[ i ][ j - 1 ], dp [ i + 1 ][ j ]) + 1;

3.初始化:无需初始化

4.填表顺序:每一行从上往下,每一列从左往右

5.返回值:dp[ 0 ][ n - 1 ]

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

这是ac代码

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

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

相关文章

流程:采集1688店铺内有成交的商品列表||1688商品订单列表+订单详情API接口

此API目前支持以下基本接口&#xff1a; item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品&#xff08;拍立淘&#xff09;item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得…

沃伦·巴菲特将AI比做原子弹:“瓶中精灵”使诈骗成为最快增长产业|TodayAI

在伯克希尔哈撒韦公司的年度股东大会上&#xff0c;投资大师沃伦巴菲特对人工智能的未来提出了严重警告。巴菲特对这项可以模拟现实并产生误导性内容的技术表示担忧&#xff0c;他认为这将成为史上增长最快的行业之一。 巴菲特在会上说&#xff1a;“当你思考诈骗人们的潜力时…

NCBI GEO王炸:GEO2R直接分析RNA-seq数据,几家欢喜几家愁?

GEO2R是NCBI GEO团队针对上传到GEO的芯片数据开发的一款在线差异分析、可视化作图工具&#xff0c;是广大数据分析人员的福音。然而&#xff0c;一直以来GEO2R仅针对芯片数据&#xff0c;对于越来越多的测序数据&#xff0c;只能下载所上传的matrix矩阵&#xff0c;进行分析&am…

ENZO:Insulin(胰岛素)ELISA kit

胰岛素是一种由胰岛β细胞合成分泌的肽类激素。它促进葡萄糖从血液中吸收到组织中&#xff0c;并以糖原和脂肪的形式储存起来&#xff1b;此外胰岛素还抑制肝脏产生葡萄糖。通过控制葡萄糖水平&#xff0c;胰岛素成为脂肪和碳水化合物代谢的调节器。当由于缺乏胰岛素分泌而失去…

成都最大视听产业园更新数字影像创作空间,影像技术打造沉浸式体验

国际数字影像产业园&#xff0c;位于成都金牛区的心脏地带&#xff0c;借助数字影视制作技术的力量&#xff0c;努力“破墙而出”&#xff0c;耕耘数字影像技术研发和创新创作的热土。 随着科技的飞速发展&#xff0c;数字影像已经成为成都文创产业的重要组成部分。为了满足国际…

航天系统工程介绍

01 什么是系统工程 系统工程&#xff08;SE&#xff09;是一个视角、一个流程、一门专业&#xff0c;正如以下三种代表性定义所阐明&#xff1a; 系统工程是一种使系统能成功实现的跨学科的方法和手段。系统工程专注于&#xff1a;在开发周期的早期阶段定义客观需要与所要求的…

【考研数学】只做《1800》和真题,能不能考90分?

网上的经验贴推荐的习题册&#xff0c;说自己刷完以后最后考了130 你以为自己也能和大佬一样&#xff0c;刷完数学也能考那么高 但实际上很多人是1800、660、880刷题刷下来最后考了四五十的 他们也不会在网上说 刷题多少&#xff0c;或者是刷哪一本习题册并不能衡量你最后能…

实力登榜!蓝卓入选2024中国未来独角兽TOP100企业

日前&#xff0c;由民建中央、中国科协指导&#xff0c;民建浙江省委会、中国投资发展促进会联合主办的第八届万物生长大会中国未来独角兽大会在杭州举办。 会上&#xff0c;《2024中国未来独角兽TOP100榜单》隆重揭晓。其中&#xff0c;蓝卓在全国参评企业中脱颖而出&#xff…

RK3568 学习笔记 : 精简 u-boot env 默认复杂的多种引导启动设置

前言 环境&#xff1a; 正点原子 Atompi-CA1 RK3568 开发板、正点原子 DLRK3568 开发板&#xff0c;&#xff08;一时脑热买了两块 RK3568 开发板&#xff09;&#xff0c;Atompi-CA1 RK3568 开发板比较小巧&#xff0c;利于一些前期的嵌入式 Linux 开发学习与实践。 RK3568 开…

VGA项目:联合精简帧+双fifo+sobel算法 实现VGA显示(未完)

前言&#xff1a;该项目实际上是在很多基础的小练习上合成起来的&#xff0c;例如涉及到uart&#xff08;rs232&#xff09;的数据传输、双fifo流水线操作、VGA图像显示&#xff0c;本次内容在此基础上又增添了sobel算法&#xff0c;能实现图像的边沿监测并VGA显示。 文章目录…

假期的最后一天...

今天是假期最后一天&#xff0c;这个假期我也跑了不少高速&#xff0c;说实话&#xff0c;看到了梅大高速塌方事故&#xff0c;心情一直不是滋味... 我就在思考&#xff0c;我们究竟在追求什么&#xff1f; 有人说生命是脆弱的&#xff0c;也有人说生命是顽强的&#xff0c;是呀…

Unity MeshRenderer 入门

概述 在项目制作过程中&#xff0c;肯定缺少不了模型的使用&#xff0c;那就一定接触过MeshRenderer&#xff0c;也许还有你不理解的地方&#xff0c;接下来让我们来学习一下这部分的内容吧。 Mesh Filter&#xff08;网格过滤器&#xff09; Mesh:提供一个网格的参考&#xf…

医学图像处理:nii格式转换(3D切片为2D)

目录 NIFTI文件结构 读取NII文件 ITK-SNAP安装 使用方法 NII转PNG NIFTI文件结构 NIFTI 格式&#xff0c;是一种用于存储和交换医学成像数据的文件格式&#xff0c;特别适用于神经影像学领域。NIFTI文件通常有两个扩展名&#xff1a;.nii&#xff08;用于图像数据&#xf…

VMP 简单源码分析

虚拟机 获取CPU的型号 实现了一个指令集解释器&#xff0c;每个操作码对应一个特定的处理函数&#xff0c;用于执行相应的指令操作。在执行字节码时&#xff0c;解释器会根据操作码查找并调用相应的处理函数来执行指令。 截获异常 先由虚拟机处理 处理不了再抛出异常 priva…

MySql#MySql安装和配置

目录 一、卸载不需要的环境 二、安装mysql yum 源 三、开始安装 四、如果保证安装成功呢&#xff1f; 五、MySql 启动&#xff01; 六、登录mysql 七、配置文件说明 八、设置开机启动&#xff01; 本次安装是在Linux环境在centos7中完成 首先先将自己切换成root 一、…

基于springboot实现图书电子商务网站系统项目【项目源码+论文说明】

基于springboot实现图书电子商务网站系统演示 摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱…

flowable流程跳转或退回到网关上的用户节点后流程走不下去了

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式&#xff0c;讲着讲着越讲越多。JVM这一块吧&#xff0c;知识比较散比较多&#xff0c;如果深研究下去如死扣《深入理解Java虚拟机》&#xff0c;这本书很深很细&#xff0c;全记住是不可能的&#xff0c;其实也没必要。趁这个机会直接把…

如何快速找出文件夹里的全部带有中文纯中文的文件

首先&#xff0c;需要用到的这个工具YTool&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 步骤 1、打开工具&#xff0c;切换到批量复制文件 2、鼠标移到右侧&#xff0c;点击搜索添加 3、设定查找范围、指定为文件、勾选 包含全部子文件夹&…

FP16与BF16区别

二者都是占用16bit空间。 FP16由1个符号位、5个指数位和10个尾数位组成。FP16在表达小数时具有较高的精度&#xff0c;但表示的最大范围相对BF16比较小。相比BF16&#xff0c;在表达较大的数时更容易出现上溢的情况。BF16由1个符号位、8个指数位和7个尾数位组成。相比于FP16&a…