【动态规划】回文串问题

一、经验总结

  • 对于回文串问题,传统的以i位置为结尾的状态表示已经不能满足要求,无法推导状态转移方程。应该创建一个二维dp表,将所有子串[i, j]的状态表示出来
  • 二维dp表的初始化和填表顺序略微复杂,有时需要借助网格图像分析

二、相关编程题

2.1 回文子串

题目链接

647. 回文子串 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

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) //j>=i{if(s[i] == s[j])dp[i][j] = i+1<j? dp[i+1][j-1]:true;if(dp[i][j]) ++ret;}}return ret;}
};

2.2 最长回文子串

题目链接

5. 最长回文子串 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:string longestPalindrome(string s) {int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));int maxlen=0, begin=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] && maxlen<j-i+1){maxlen = j-i+1;begin = i;}}}return s.substr(begin, maxlen);}
};

2.3 分割回文串Ⅳ

题目链接

1745. 分割回文串 IV - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

见代码

编写代码

class Solution {
public:bool checkPartitioning(string s) {//1.预处理:用dp表统计所有的子串是否是回文串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;}}//2.分割检查:枚举所有的第二个子字符串的起始及结束位置for(int i = 1; i < n-1; ++i){for(int j = i; j < n-1; ++j){if(dp[0][i-1] && dp[i][j] && dp[j+1][n-1])return true;}}return false;}
};

2.4 分割回文串Ⅱ

题目链接

132. 分割回文串 II - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

class Solution {
public:int minCut(string s) {//1.预处理:用dp1表统计所有的子串是否是回文串int n = s.size();vector<vector<bool>> dp1(n, vector<bool>(n));for(int i = n-1; i >= 0; --i){for(int j = i; j < n; ++j){if(s[i] == s[j])dp1[i][j] = i+1<j? dp1[i+1][j-1]:true;}}//2.动态规划:用dp2表统计[0,i]区间上的最少分割次数vector<int> dp2(n, INT_MAX);for(int i = 0; i < n; ++i){if(dp1[0][i]) dp2[i] = 0;else{//将[0,i]分割成[0,j-1]和[j,i]for(int j = 1; j <= i; ++j)if(dp1[j][i])dp2[i] = min(dp2[i], dp2[j-1]+1);}}return dp2[n-1];}
};

2.5 最长回文子序列

题目链接

516. 最长回文子序列 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

编写代码

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; //处理i==jfor(int j = i+1; j < n; ++j){if(s[i] == s[j])dp[i][j] = dp[i+1][j-1]+2; //统一处理i+1==j和i+1<jelsedp[i][j] = max(dp[i+1][j], dp[i][j-1]);}}return dp[0][n-1];}
};

2.6 变为回文串的最少插入次数

题目链接

1312. 让字符串成为回文串的最少插入次数 - 力扣(LeetCode)

题目描述

在这里插入图片描述

算法原理

在这里插入图片描述

细节问题:

  1. j从i+1开始循环,跳过i==j的情况,默认为0
  2. i+1==j 和 i+1<j 可以统一处理,因为dp表默认为0
  3. 无需初始化,因为边界情况前面已经特殊处理过了,不会越界
  4. 根据填表的需要:dp[i][j-1]和dp[i+1][j];填表顺序从下往上,从左往右,

编写代码

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];}
};

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

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

相关文章

Web安全:SQL注入

一、SQL注入三要素 1、用户可以对输入的参数值进行修改。 2、后端不对用户输入的参数值进行严格过滤。 3、用户修改后的参数值可以被带入后端中成功执行&#xff0c;并返回一定结果。 二、SQL注入原理 简单来说&#xff0c;用户输入的值会被插入到SQL语句中&#xff0c;然后…

秋招突击——7/10——复习{}——新作{在排序数组中查找元素的第一个最后一个位置、搜索旋转排序数组}

文章目录 引言复习新作在排序数组中查找元素的第一个和最后一个位置个人实现参考实现 搜索旋转排序数组个人实现参考实现 总结 引言 复习 新作 在排序数组中查找元素的第一个和最后一个位置 题目链接 注意 非递减序列》元素是递增或者相等&#xff0c;并不是严格递增的找到…

什么软件可以AI生成PPT?交给这5款AI PPT工具就完事

话说在当下快节奏的工作中&#xff0c;PPT制作几乎已经成为不可或缺的一部分~每天不是在做PPT的路上&#xff0c;就是在改PPT的途中。 好在幸运的是&#xff0c;现在可有不少好用的AI PPT制作工具能够来帮助我们轻松应对这一难题&#xff01;今天就来给大家分享5款实在又百搭的…

Autosar网络管理:发出第一帧网络管理报文的方法

Autosar网络管理:发出第一帧网络管理报文的方法 1. 为什么要第一帧发出网络管理报文 很多OEM要求CAN网络管理第一帧发出的是网络管理报文,目的是为了快速唤醒CAN网络 2. 节点外发第一帧报文不是网络管理报文的原因 首先根据AUTOSAR CANNM规范要求,节点要能够发出网络管理…

TCP协议双向网络通讯---Python实现

本篇文章是博主在人工智能、网络通讯等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在Python…

捷配笔记-PCB阻焊颜色对产品有什么影响?

阻焊层也称为阻焊层或阻焊剂。它是一种薄的聚合物层&#xff0c;应用于&#xff08;PCB&#xff09;。阻焊层的目的是保护PCB表面&#xff0c;并有助于防止焊桥。焊桥是两个导体之间的无意连接&#xff0c;通常是由于存在一小块焊料。需要注意的是&#xff0c;阻焊层被视为其单…

electron实现右键菜单保存图片功能

1.创建窗口&#xff0c;加载页面&#xff0c;代码如下&#xff1a; //打开窗口const {ipcMain, BrowserWindow} require("electron") const saveImage require("../ipcMain/saveImage") let win null; ipcMain.handle(on-open-event, (event, args) &g…

数字信号处理及MATLAB仿真(5)——z变换

采样的其他概念咱们后面再慢慢的讲述吧&#xff0c;先把z变换的程序给大家展示一下&#xff0c;总的来说呢&#xff0c;就用一个函数——ztran就行了。在 MATLAB 中&#xff0c;可以使用 ztrans 函数来进行 Z 变换。ztrans 函数用于对离散时间信号或系统进行 Z 变换&#xff0c…

mysql中select语句的执行顺序

执行顺序是什么&#xff1f; Form 这一阶段读取表的数据&#xff0c;并准备执行后续的操作。如果有多表连接&#xff0c;这一步也会涉及连接操作&#xff08;INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN 等&#xff09;。 ON 在进行表连接时&#xff0c;使用 ON 关键字指…

C++入门 模仿mysql控制台输出表格

一、 说明 控制台输出表格&#xff0c;自适应宽度 二、 源码 #include <iostream> #include <map> #include <string> #include <vector>using namespace std;void printTable(vector<vector<string>> *pTableData) {int row pTableDa…

VS2022 git拉取/推送代码错误

第一步&#xff1a;打开VS2022 第二步&#xff1a;工具->选项->源代码管理->Git 全局设置 第三步&#xff1a;加密网络提供程序设置为&#xff1a;OpenSSL 完结&#xff1a;

基于java+springboot+vue实现的大学城水电管理系统(文末源码+Lw)106

基于SpringBootVue的实现的大学城水电管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 本大学城水电管理系统 管理员功能有个人中心&#xff0c;用户管理&#xff0c;领用设备管理&#xff0c;消耗设备管理&#x…

AV1编码标准中块分区技术详细说明

libaom 开放媒体联盟视频1&#xff08;AV1&#xff09;编解码器的框架基于一种混合视频编码结构&#xff0c;由几个主要的功能模块组成&#xff0c;如预测、变换、量化、熵编码和环路滤波。每个功能模块使用特定类型的视频编码技术处理输入数据&#xff0c;其输出被送入另一个功…

科研绘图系列:R语言金字塔图(pyramid plot)

介绍 金字塔图(Pyramid chart)是一种用于展示人口统计数据的图表,特别是用于展示不同年龄段的人口数量。这种图表通常用于展示人口结构,比如性别和年龄的分布。 特点: 年龄分层:金字塔图按年龄分层,每一层代表一个年龄组。性别区分:通常,男性和女性的数据会被分别展…

FiddlerScript Rules修改-更改发包中的cookie

直接在fiddler script editor中增加如下处理代码即可 推荐文档oSession -- 参数说明 测试笔记 看云

fork的理解

一. 注意点 1.进程是并发的&#xff0c;主进程和子进程同时进行&#xff0c;效率高2.子进程产生时是完全复制主进程的状态的&#xff0c;只有在产生修改的时候才会单独分配资源。 二. 下面程序一共应该为8个进程&#xff0c;但code的终端看到只有7个进程号的原因。因为fork返…

FastAPI 学习之路(四十一)定制返回Response

接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…

【Linux】管道命令

命令执行的时候有时会输出数据&#xff0c;有的命令输出的数据太繁杂了。 那么我们怎么去筛选这些信息来得到我们所想要的格式&#xff1f; 这就牵涉到管道命令的问题了&#xff08;pipe&#xff09;&#xff0c;管道命令使用的是【|】这个界定符号。另外&#xff0c;管道命令与…

centos 安装ffmpeg

这个错误表明在你的 CentOS 系统的默认仓库中没有 ffmpeg 包。CentOS 的默认仓库通常不包含 ffmpeg&#xff0c;因为它涉及一些许可证问题。但是&#xff0c;你可以通过添加第三方仓库来安装 ffmpeg。 使用 EPEL 和 RPM Fusion 仓库 # 安装 EPEL 仓库 sudo yum install epel-…

项目管理工具评测:2024年国内外最顶级的10款项目管理工具排行

国内外涌现出众多优秀的项目管理工具&#xff0c;它们各自在功能、易用性、集成能力等方面展现出独特优势。以下是国内外顶级的10款项目管理工具&#xff1a; 一、进度猫 推荐理由&#xff1a;进度猫以其直观的任务管理和进度跟踪功能&#xff0c;成为许多团队和项目的首选…