【动态规划算法】-回文串问题题型(34-40题)

在这里插入图片描述
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言
  • 第三十五题:[647. 回文子串](https://leetcode.cn/problems/palindromic-substrings/)
  • 第三十六题:[5. 最长回文子串](https://leetcode.cn/problems/longest-palindromic-substring/)
  • 第三十七题:[1745. 分割回文串 IV](https://leetcode.cn/problems/palindrome-partitioning-iv/)
  • 第三十八题:[132. 分割回文串 II](https://leetcode.cn/problems/palindrome-partitioning-ii/)
  • 第三十九题:[516. 最长回文子序列](https://leetcode.cn/problems/longest-palindromic-subsequence/)
  • 第四十题:[1312. 让字符串成为回文串的最少插入次数](https://leetcode.cn/problems/minimum-insertion-steps-to-make-a-string-palindrome/)


前言

今天博主来讲解动态规划的另一个题型就是回文串问题,这个系列的问题,套路差不多,首先大家要了解什么是回文串,就是在原串中选出连续的一个子串,判断是不是回文的即可,接下来我们将会一题题的给大家进行讲解,话不多说,我们开始进入正文


第三十五题:647. 回文子串

题目解析:

动态规划算法:

1. 状态表示:经验+题目要求
做这个系列的问题我们就是将子串是否为回文的结果放到dp表里面,因为你要插进来的字符是否和前面构成回文,首先保证前面的子串是回文才行,所以我们的dp表,需要一个二维的,表示回文子串的起始和结尾

dp[i][j]表示:以i,j位置为结尾的子串是否为回文子串,(i<=j)

2. 状态转移方程:
在这里插入图片描述

3. 初始化:保证数组不越界

我们j是大于等于i的,但是会越界的情况已经单独拿出来分析了,所以不用初始化

4. 填表顺序:
在这里插入图片描述

所以我们要从上往下进行填表

5. 返回值:

返回为真的个数就可以了

代码实现:

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

运行结果:
在这里插入图片描述

这一题可以说是为后面的题目做铺垫,相当于一个引子


第三十六题:5. 最长回文子串

题目解析:
在这里插入图片描述

此题就是找到最长回文子串,做法和上一题一模一样,先用dp表存放是否构成回文串,有起始位置和结束位置就可以算出来长度。

动态规划算法:

1. 状态表示:经验+题目要求

dp[i][j]表示:以i,j位置为结尾的子串是否为回文子串,(i<=j)

2. 状态转移方程:
在这里插入图片描述

每次填完dp表的时候,就计算一个长度,i表示起始位置,j表示结束位置,长度为j-i+1,

3. 初始化:保证数组不越界

我们j是大于等于i的,但是会越界的情况已经单独拿出来分析了,所以不用初始化

4. 填表顺序:
在这里插入图片描述

所以我们要从上往下进行填表

5. 返回值:

将长度和起始位置算出来,通过substr来获取子串返回即可

代码实现:

class Solution {
public:string longestPalindrome(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n));int len=1,start=0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){if(i==j||i+1==j)dp[i][j]=true;elsedp[i][j]=dp[i+1][j-1];}if(dp[i][j]&&len<j-i+1)//选出最长的回文子串{len=j-i+1,start=i;}}}return s.substr(start,len);}
};

运行结果:
在这里插入图片描述


第三十七题:1745. 分割回文串 IV

题目解析:
在这里插入图片描述

这个题目还是非常的好理解的,因为有固定的数,分成三个回文子串。
在这里插入图片描述
先将子串是否为回文子串放到dp表里面,然后再枚举dp表就行了。

这题我就不详细讲解了,直接上代码了
代码实现:

class Solution {
public:bool checkPartitioning(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n));int count=0;for(int i=n-1;i>=0;i--)//将子串是否是文回放到dp表里面{for(int j=i;j<n;j++){if(s[i]==s[j]){if(i==j||i+1==j)dp[i][j]=true;elsedp[i][j]=dp[i+1][j-1];}}}for(int i=1;i<n-1;i++)//第一个至少要留出来一个位置{for(int j=i;j<n-1;j++)//最后一个也要留出来一个位置{if(dp[i][j]&&dp[0][i-1]&&dp[j+1][n-1])return true;}}return false;}
};

运行结果:

在这里插入图片描述


第三十八题:132. 分割回文串 II

题目解析:

在这里插入图片描述

动态规划算法:

1. 状态表示:经验+题目要求
我们以某一个位置来考虑问题:

dp[i]表示:从0开始到以i位置为结尾的子串中将子串分割成每个部分都是回文子串的最少的切割次数

2. 状态转移方程:
这题和单词拆分的思想有点像,再[0,i]区间中选择一个j,此时j位置就是最后一刀切割的地方,前面切割的次数,加上最后一刀就是总次数

在这里插入图片描述
3. 初始化:保证数组不越界
j-1是不会越界的,j>0的。
因为要保证第一次求最小值的时候不能干扰到选择dp[j-1]+1,所以不初始化,就为01,那么最小值一直都是0,所以干脆就初始化为最大值。

4. 填表顺序:
从左往右
5. 返回值:
返回dp[n-1];

代码实现:

class Solution {
public:int minCut(string s) {int n=s.size();vector<vector<bool>> isPal(n,vector<bool>(n));int count=0;for(int i=n-1;i>=0;i--)//将子串是否是文回放到dp表里面{for(int j=i;j<n;j++){if(s[i]==s[j]){if(i==j||i+1==j)isPal[i][j]=true;elseisPal[i][j]=isPal[i+1][j-1];}}}//创建dp表+初始化vector<int> dp(n,INT_MAX);for(int i=0;i<n;i++){if(isPal[0][i]){dp[i]=0;}else{for(int j=1;j<=i;j++)if(isPal[j][i])dp[i]=min(dp[j-1]+1,dp[i]);}   }   //返回值return dp[n-1];}
};

运行结果:
在这里插入图片描述


第三十九题:516. 最长回文子序列

题目解析:
在这里插入图片描述

动态规划算法:

1. 状态表示:经验+题目要求
dp[i]表示:以i位置元素为结尾的子序列中最长的回文子序列的长度
在这里插入图片描述

上面的状态表示不行,我们要重新定义状态表示,定义两个位置
dp[i][j]表示:s字符串里面【i,j】子区间内的所有子序列中最长回文子序列的长度

2. 状态转移方程:
在这里插入图片描述

3. 初始化:保证数组不越界
我们看到会使用到使用到j-1或者i+1位置的值
在这里插入图片描述

4. 填表顺序:
我们会使用到
dp[i+1][j]正下方的值
dp[i][j-1]左边的值
dp[i+1][j-1]左下方的值

从下往上,从左往右

5. 返回值:
返回整个字符串区间dp[0][n-1]

代码实现:

class Solution {
public:int longestPalindromeSubseq(string s) {int n=s.size();//创建dp表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]=dp[i+1][j-1]+2; //放在一起考虑了 else dp[i][j]=max(dp[i][j-1],dp[i+1][j]);//不相等的时候}}//返回值return dp[0][n-1];}
};

运行结果:
在这里插入图片描述


第四十题:1312. 让字符串成为回文串的最少插入次数

题目解析:
在这里插入图片描述

这题还是按照上一题的分析方式一样,选择一个区间去分析。

动态规划算法:

1. 状态表示:经验+题目要求

dp[i][j]表示:s字符串以[i,j]区间内想要变成回文串要插入的最少次数

2. 状态转移方程:
在这里插入图片描述

3. 初始化:保证数组不越界

根据上题的分析无需初始化

4. 填表顺序:

从下往上,从左往右

5. 返回值:

dp[0][n-1];

代码实现:

class Solution {
public:int minInsertions(string s) {int n=s.size();//创建dp表vector<vector<int>> dp(n,vector<int>(n));for(int i=n-1;i>=0;i--)//从下往上for(int j=i+1;j<n;j++)//从左往右,从i+1位置,因为i==j的情况为0不需要考虑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];}
};

运行结果:
在这里插入图片描述

到这里我们的回文串问题就讲解完毕了,这类题型之间的练习都挺大了,上一题的经验可以大量的运用到下一题上,这给我们的学习也带来了很大的帮助,但凡不是一题题做过来的,那么后面的每一题都很难想到,所以我们要善于总结,这样下次单独碰到一题就不会没有头绪,好了,我们今天的题目就先讲解到这里了,我们下篇介绍关于两个数组的dp问题。

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

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

相关文章

CRM系统如何进行公海池线索分配自动化?

在销售过程中&#xff0c;线索分配是一个非常重要的环节。传统的线索分配方式往往是由销售主管手动进行&#xff0c;不仅效率低下&#xff0c;还存在着不公平、不灵活的问题。因此&#xff0c;许多企业通过CRM来实现公海池线索分配自动化。 1、基于规则的分配 CRM可以让用户设…

express学习笔记6 - 用户模块

新建router/user.js const express require(express) const routerexpress.Router() router.get(/login, function(req, res, next) {console.log(/user/login, req.body)res.json({code: 0,msg: 登录成功})})module.exportsrouter 在router/user.js引入并使用 const us…

Vue进阶(幺叁陆): transition标签实现页面跳转动画

文章目录 一、前言二、方案实现三、延伸阅读 transition标签四、拓展阅读 一、前言 在Vue项目开发过程中&#xff0c;应用全家桶vue-router实现路由跳转&#xff0c;且页面前进、后退跳转过程中&#xff0c;分别对应不同的切换动画。vue-router 切换页面时怎么设置过渡动画&am…

MySQL日志——错误日志、二进制日志

错误日志二进制日志查询日志慢查询日志 1.错误日志 查看日志位置&#xff1a; show variables like %log_error%查看错误日志&#xff1a; tail -f /var/log/mysql.log2.二进制日志 show variables like %log_bin%;cd /var/lib/mysql ll2.1 日志格式 查看日志格式指令&…

计算机视觉与图形学-神经渲染专题-ConsistentNeRF

摘要 Neural Radiance Fields (NeRF) 已通过密集视图图像展示了卓越的 3D 重建能力。然而&#xff0c;在稀疏视图设置下&#xff0c;其性能显着恶化。我们观察到&#xff0c;在这种情况下&#xff0c;学习不同视图之间像素的 3D 一致性对于提高重建质量至关重要。在本文中&…

【多模态】21、BARON | 通过引入大量 regions 来提升模型开放词汇目标检测能力(CVPR2021)

文章目录 一、背景二、方法2.1 主要过程2.2 Forming Bag of Regions2.3 Representing Bag of Regions2.4 Aligning bag of regions 三、效果 论文&#xff1a;Aligning Bag of Regions for Open-Vocabulary Object Detection 代码&#xff1a;https://github.com/wusize/ovdet…

pytorch(续周报(1))

文章目录 2.1 张量2.1.1 简介2.1.2 创建tensor2.1.3 张量的操作2.1.4 广播机制 2.2 自动求导Autograd简介2.2.1 梯度 2.3 并行计算简介2.3.1 为什么要做并行计算2.3.2 为什么需要CUDA2.3.3 常见的并行的方法&#xff1a;网络结构分布到不同的设备中(Network partitioning)同一层…

微服务系列<3>---微服务的调用组件 rpc 远程调用

什么是rpc调用,让我们调用远程方法就像调用本地方法一样 这就属于rpc调用 rpc是针对于本地来说的 调用远程方法根调用本地方法一样 如果能达到这种效果 就是rpc调用如果达到一种效果 调用远程和调用本地一样 他就是一种rpc框架2个微服务 之间发的调用 我们之前通过ribbon的方式…

springboot访问请求404的原因

是记录&#xff0c;可能出现错误 可能出现的原因 1.你请求的URL路径不对,比如说你请求的路径是/usr/list,GET方法,但是你UserController上面的RequestMapping是这个样子:RequestMapping(“user”)&#xff0c;有可能哈 2.前端的请求时GET方法&#xff0c;后端对应的处理函数的方…

【Linux命令200例】whereis用于搜索以及定位二进制文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

IDA+Frida分析CTF样本和Frid源码和objection模块

文章目录 一些资料IDA调试命令IDA调试安卓的10个技巧objection基本使用 Wallbreaker1frida源码阅读之frida-java 第一个实例EasyJNI第二个实例objection资料 art_trace2.pyart_trace2.js IDAFrida分析CTF样本和Frid源码和objection模块 一些资料 IDA调试命令 adb devices adb…

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…

Curve深陷安全事件,OKLink如何破局

出品&#xff5c;欧科云链研究院 作者&#xff5c;Matthew Lee 7月31号&#xff0c;Curve 在平台表示 Vyper 0.2.15 的稳定币池由于编译器的漏洞所以遭到攻击。具体因为重入锁功能的失效&#xff0c;所以黑客可以轻易发动重入攻击&#xff0c;即允许攻击者在单次交易中执行某…

二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

文章目录 算法模板Dijkstra题目代码模板朴素dijkstra算法堆优化版dijkstra 树与图的存储(1) 邻接矩阵&#xff1a;(2) 邻接表&#xff1a;关于e[],ne[],h[]的理解 关于堆的原理与操作 模板题Dijkstra求最短路 I原题链接题目思路题解 Dijkstra求最短路 II原题链接题目思路题解 1…

05|Oracle学习(UNIQUE约束)

1. UNIQUE约束介绍 也叫&#xff1a;唯一键约束&#xff0c;用于限定数据表中字段值的唯一性。 1.1 UNIQUE和primary key区别&#xff1a; 主键/联合主键每张表中只有一个。UNIQUE约束可以在一张表中&#xff0c;多个字段中存在。例如&#xff1a;学生的电话、身份证号都是…

AWS——01篇(AWS入门 以及 AWS之EC2实例及简单实用)

AWS——01篇&#xff08;AWS入门 以及 AWS之EC2实例及简单实用&#xff09; 1. 前言2. 创建AWS账户3. EC23.1 启动 EC2 新实例3.1.1 入口3.1.2 设置名称 选择服务3.1.3 创建密钥对3.1.4 网络设置——安全组3.1.4.1 初始设置3.1.4.2 添加安全组规则&#xff08;开放新端口&…

尝试多数据表 sqlite

C 唯一值得骄傲的地方就是 通过指针来回寻址 &#x1f602; 提高使用的灵活性 小脚本buff 加成

Windows用户如何将cpolar内网穿透配置成后台服务,并开机自启动?

Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f; 文章目录 Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f;前置准备&#xff1a;VS Code下载后&#xff0c;默认安装即可VS CODE切换成中文语言 1. 将…

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器&#xff0c;可以用作多级分类的场景。引入插件后&#xff0c;发现做不到只选择年级&#xff0c;不选择班级&#xff08;似乎&#xff0c;只能到最后子节点了&#xff09;。 需求中&#xff0c;有可能选择的不是叶子。比如&a…

适应于Linux系统的三种安装包格式 .tar.gz、.deb、rpm

deb、rpm、tar.gz三种Linux软件包的区别 rpm包-在红帽LINUX、SUSE、Fedora可以直接进行安装&#xff0c;但在Ubuntu中却无法识别&#xff1b; deb包-是Ubuntu的专利&#xff0c;在Ubuntu中双击deb包就可以进入自动安装进程&#xff1b; tar.gz包-在所有的Linux版本中都能使用…