动态规划专训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;“当你思考诈骗人们的潜力时…

【嵌入式DIY实例】-蓝牙控制小车

DIY蓝牙控制小车 文章目录 DIY蓝牙控制小车1、硬件准备与接线2、控制指令设计3、代码实现在本文中,将演示如何通过蓝牙来控制一个4轮小车。控制指令由Android智能手机下发。在应用中,可以通过前进、后退、向右、向左、停止等命令来操作它。 此外,它还有一些额外的功能,如前…

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;在开发周期的早期阶段定义客观需要与所要求的…

Docker 容器日志占用空间过大解决办法

1、vi /etc/docker/daemon.json {"log-driver":"json-file","log-opts": {"max-size":"200m", "max-file":"1"} } 2、重新加载守护进程配置文件 systemctl daemon-reload 3、重启docker systemctl…

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

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

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

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

c语言结构体指针定义

struct stu_t *dev, *brother_dev;struct stu_t *dev, brother_dev; 这两行代码看起来是C或C的代码片段&#xff0c;它们定义了两个名为dev和brother_dev的变量&#xff0c;其类型为 struct stu_t 的指针。 下面是每行代码的描述&#xff1a; struct stu_t *dev, *brother_de…

一、ESP32基础知识

1、乐鑫产品线 系列特点ESP8266无ESP32无ESP32-S2无ESP32-C3无ESP32-S3无ESP32-C2/ESP8684无ESP32-C6无ESP32-H2无 2、开发方式 2.1、ESP-IDF (1)面向专业开发者。乐鑫官方开发框架&#xff0c;专门为ESP32系列芯片设计。支持C/C语言&#xff0c;并提供一套完整的API&#…

c语言排序算法之七(希尔排序)

前言 以下内容是被验证可以有效理解希尔排序&#xff0c;代码也较容易理解。如果你发现还有很多需要增加的&#xff0c;欢迎留言。 为什么要单独写排序算法这一系列&#xff0c;看过一些贴子普遍篇幅较长。看完还依旧云里雾里&#xff0c;难以直观理解原理及整个过程。代码永…

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;是呀…

【C++风云录】科学可视化与数据分析:从特性探索到高级应用实践

科技赋能&#xff1a;六大工具助力你的职业生涯 前言 在本文中&#xff0c;我们将对六种广泛使用的计算机视觉和图形库进行深入介绍&#xff0c;这些库包括VTK、D3.js、OpenCV、Eigen、Boost和PCL。每个章节都会包含库的基本介绍&#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…

持续总结中!2024年面试必问 100 道 Java基础面试题(三十二)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;三十一&#xff09;-CSDN博客 六十三、接口里面可以写方法实现吗&#xff1f; 在Java中&#xff0c;接口&#xff08;Interface&#xff09;主要用于定义一组抽象方法&#xf…