C++_回文串

目录

 回文子串

最长回文子串

 分割回文串 IV

 分割回文串 II

 最长回文子序列

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


 回文子串

647. 回文子串

思路,i  j表示改范围内是否为回文串,

②倒着遍历是为了取出dp[i + 1][j - 1]

③i j 只有一对,不会重复,其实就是遍历

参考代码

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--){// dp[i][i] = true;// for(int j = i + 1; j < n; j++)// {//     if(s[i] == s[j])//         dp[i][j] = j - i > 1 ? dp[i + 1][j - 1] : true;//     if(dp[i][j]) ret++;//判断每一次// }for(int j = i; j < n; j++){if(s[i] == s[j])dp[i][j] = j - i > 1 ? dp[i + 1][j - 1] : true;//只有最后一层会越界,但是if(dp[i][j])ret++;}}// return ret + n;return ret;}
};

最长回文子串

5. 最长回文子串

思路区间[i,  j] 是true时候再判断

参考代码

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

 分割回文串 IV

1745. 分割回文串 IV

用区间[i, j]即可分成三段 ,只要i j 不同,三段必不相同

参考代码

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] = j - i > 1 ? 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;}
};

 分割回文串 II

132. 分割回文串 II

刚开始打算用dp[i, j]区间内需要的次数 ,发现逻辑就不对,以左右单个字符拎出来,在min剩下的,最小分割的位置很可能在中间某个位置;所以打算重新遍历数组,和139. 单词拆分的思路很像,[0, i] 区间存放的就是最小分割次数

参考代码

class Solution {
public:int minCut(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 + 1][j], dp[i][j - 1]) + 1;//     }// }// return dp[0][n - 1];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] = j - i > 1 ? dp[i + 1][j - 1] : true;vector<int> times(n, INT_MAX);times[0] = 0;for(int i = 1; i < n; i++){if(dp[0][i]) times[i] = 0;elsefor(int j = 1; j <= i; j++)if(dp[j][i])times[i] = min(times[i], times[j - 1] + 1);}return times[n - 1];}
};

 最长回文子序列

516. 最长回文子序列 

 

 因为[i ,j] 表示的是区间内的最长回文子序列,这里我不怎么能直接理解,这里的j每次往后走,应该是去尝试匹配s[i],那么有人会说s[i] 可能和[i + 1, j - 1] 区间内有匹配了,那么用s[j]去匹配,不就少了一个吗?其实不然,这时候中间不管是否和s[i]相同,【 s[i] ,中间字符,s[j] 】就是一个回文子序列,这样是最大的;如果不相等,因为说了,状态表示的是区间内的最长回文子序列,这时候去已经有的区间里面找最长的已知区间就是[i + 1, j] 和 [i , j + 1],那为什么不去[i, j] 里找,因为没有啊,这时候,dp[i][j]是左值呀

参考代码

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

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

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

 

 dp表示的是区间[i,  j] 内需要添加的最小次数,同样的道理,如果不相等就是去消除s[i] 或者s[j],消除伴随着 +1,也就是dp[i][j] = min(dp[i][j - 1], dp[i + 1][j]) + 1,你可能会感觉不对,  有可能是min(dp[i][j - 2], dp[i + 2][j])那么随之后面就要+2,但是这个时候可能s[i] 和s[j - 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];elsedp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;}}return dp[0][n - 1];}
};

总结:通过区间[i,  j]来表示每个区间是否为回文串 ,是的话在进行怎样怎样的操作

我的错误发生: i总是写错i++, 注意力不集中

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

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

相关文章

C++模版(一)

C++模版 概念函数模版函数模版语法注意事项普通函数和函数模版区别普通函数和函数模版的调用规则模版的局限性具体化模版本质分析概念 模版也可称之为泛型,可以理解为模具,通过模具可以创建多种实现,大大提高了复用性。 实际生活中,有很多模版的例子。比如我们的入职简历,…

harmonyOS简介及背景

harmonyOS的场景模式18n: 1&#xff08;入口手机&#xff09;8&#xff08;电脑、VR、手环、iPad、智慧屏、&#xff09;–wifi—n(车载、智能家居等所有)harmonyOS不需要考虑软硬件的差异&#xff0c;是一个兼容N种的超级终端harmonyOS干了两件事&#xff1a; &#xff08;1&a…

施工升降机AI数人数识别摄像机

施工现场作为一个复杂的工作环境&#xff0c;在施工过程中通常会有大量的人员出入&#xff0c;为了确保施工安全和管理效率&#xff0c;近年来施工升降机AI数人数识别摄像机应运而生。 这种摄像机依靠先进的人工智能技术和摄像头设备&#xff0c;能够实时监测和识别施工升降机内…

AIGC——ComfyUI工作流搭建、导入与常用工作流下载

工作流 ComfyUI工作流是一个基于图形节点编辑器的工作流程&#xff0c;通过拖拽各种节点到画布上&#xff0c;连接节点之间的关系&#xff0c;构建从加载模型到生成图像的流程。每个节点代表一个与Stable Diffusion相关的模型或功能&#xff0c;节点之间通过连线传递图片信息。…

2390.从字符串中移除星号

题目&#xff1a;给你一个包含若干星号 * 的字符串 s 。 在一步操作中&#xff0c;你可以&#xff1a; 选中 s 中的一个星号。移除星号 左侧 最近的那个 非星号 字符&#xff0c;并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意&#xff1a; 生成的输入保证总是…

如何对静态IP进行测试?静态IP有什么优点?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

【JS】数组查重

码 /*** 数组查重* param {Array} arr 查重的数组* returns Array 返回不重复的数组 */ const noReArr arr > [...new Set(arr)]const a [12,12,3,4] console.log( noReArr(a) );效果图

031—pandas 读取解析实验室数据至DataFrame

前言 某个科研实验室在进行一项物理实现&#xff0c;实验仪器会输出一个 txt 文本的数据&#xff0c;研究人员需要从这个文本中将数据结构化才能进行进行统计分析。 在为个解析和分析过程中&#xff0c;他们选择了 Python 的 pandas 库来完成这些操作。我们今天来完成这这个 t…

使用AOP拦截全局请求并校验请求参数

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

列表(list)篇(一)

文章目录 2.1 创建列表2.2 append()函数2.3 clear()函数2.4 copy()函数2.5 count()函数2.6 del2.7 enumerate()函数2.8 extend()函数2.9 index()函数 2.1 创建列表 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种基础的数据结构&#xff0c;可以包含不同类型的…

【数据结构】猛猛干11道链表OJ(未完待续ing)

前言知识点 链表的调试技巧 int main() {struct ListNode* n1(struct ListNode*)malloc(sizeof(struct ListNode));assert(n1);struct ListNode* n2(struct ListNode*)malloc(sizeof(struct ListNode));assert(n2);struct ListNode* n3(struct ListNode*)malloc(sizeof(struc…

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

对话奇酷网络董事长吴渔夫: 迟到的游戏公司会被AI浪潮卷入海底

“ 迟到的游戏公司会被无形的 AI 浪潮卷入海底。” 整理 | 梦婕 编辑 | 云舒 出品&#xff5c;极新 2024年3月4日&#xff0c;在极新与吴渔夫的对话中&#xff0c;吴渔夫多次呼吁“全力拥抱AI”。在这场AI浪潮中&#xff0c;作为中国网游的先锋&#xff0c;他带着 25 年“中…

Flutter项目组件模块化开发的实践与搭建

在Flutter应用程序的开发中&#xff0c;组件模块化是一种非常重要的开发方式&#xff0c;它可以提高代码的可维护性、复用性和扩展性。本文将介绍如何在Flutter项目中搭建组件模块化开发的框架&#xff0c;并给出实际的实践示例。 1. 为什么需要组件模块化开发&#xff1f; 在…

【web前端】<meta>标签

meta元素可以提供有关页面的元信息&#xff08;meta-information&#xff09; meta标签位于文档的头部&#xff0c;是空元素 meta元素的属性 属性值描述http-equiv expires refresh X-UA-compatible 定义HTTP协议的头部元信息名称。其中&#xff0c;expires设置网页在缓存区的…

记录一下目前为止的算法成长

每日笔记 复习曲线 间隔1天、3天、7天、15天、30天&#xff0c;然后以一个月为周期复习 2023. 12. 24 一定要每天早中晚都要复习一下 早中午每段一两道, 而且一定要是同一个类型, 不然刷起来都没有意义 11.29 开始向着面试刷题跟进! 每天刷4题左右 ,一周之内一定要是统一类…

c语言:最大公约数

最大公约数 任务描述 最大公约数&#xff08;也称最大公因数、最大公因子&#xff09;&#xff0c;指两个或多个整数共有约数中最大的一个。 编程输入两个正整数&#xff0c;输出它们的最大公约数。 输入示例 36 24输出示例 12代码 方法1&#xff1a;辗转相除法 #inclu…

笔记本8代i5和台式机12代i5的性能比较

一、 台式机12代i5 二、笔记本8代i5 在多核性能上差不多是2.4倍&#xff0c;所以跑大一点的Matlab或者别的程序&#xff0c;用台式机&#xff0c;后边实验室能用上超多核服务器另说。

uniapp,导航栏(切换项)有多项,溢出采取左滑右滑的形式展示

一、实现效果 当有多项的导航&#xff0c;或者说切换项&#xff0c;超出页面的宽度&#xff0c;我们采取可滑动的方式比较好一些&#xff01;并且在页面右边加个遮罩&#xff0c;模拟最右边有渐变效果&#xff01; 二、实现代码 html代码&#xff1a; <!-- 头部导航栏 --…

鸿蒙Harmony应用开发—ArkTS-转场动画(共享元素转场)

当路由进行切换时&#xff0c;可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 属性 名称参数参数描述…