【动态规划】回文串(二)

📝前言说明:

  • 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行不同专题的动态规划的学习

点击链接开始学习
斐波那契数列模型路径问题
简单多状态(一)简单多状态(二)
子数组系列(一)子数组系列(二)
子序列问题(一)子序列问题(二)
回文串(一)回文串(二)
两个数组dp问题(一)两个数组的dp问题(二)
01背包问题完全背包
二维的背包问题其他

题单汇总链接:点击 → 题单汇总

题目

  • 132. 分割回文串 II
    • 优质解
  • 516. 最长回文子序列
    • 优质解
  • 1312. 让字符串成为回文串的最少插入次数
    • 优质解


132. 分割回文串 II

题目链接:https://leetcode.cn/problems/palindrome-partitioning-ii/description/
在这里插入图片描述


优质解

思路:

  • 对表示是否是回文子串的 isPal 数组再做一次 dp
  • dp[i]: s[0 - i] 中要分割的最少次数
  • 我们可以把串分成:[0 - j-1][j - i],而 dp[j - 1] 可以表示以 j - 1 结尾的子串分割的最小次数(已知)
  • 所以 j 遍历:1 <= j <= i,
    • 如果 [j - i] 可以构成回文串: dp[i] = dp[j - 1] + 1,
    • 不能构成: 跳过(迟早到 i == j 的时候会构成回文)
    • 取循环中得到的 dp[i] 的最小值

代码:

class Solution {
public:int minCut(string s) {int n = s.size();vector<vector<bool>> isPal(n, vector<bool>(n, 0));for(int i = n - 1; i >= 0; i--){for(int j = i; j < n; j++){if(s[i] == s[j])isPal[i][j] = i + 1 < j ? isPal[i + 1][j - 1] : true;}}// 对 isPal 做 dpvector<int> dp(n, INT_MAX / 2);for(int i = 0; i < n; i++){if(isPal[0][i]) dp[i] = 0; // 判断 0 - ielse{for(int j = 1; j <= i; j++){if(isPal[j][i])dp[i] = min(dp[i], dp[j - 1] + 1);}}}return dp[n - 1];}
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)


516. 最长回文子序列

题目链接:https://leetcode.cn/problems/longest-palindromic-subsequence/description/
在这里插入图片描述


优质解

思路

状态表示

  • dp[i][j]: [i, j]区间内的所有子序列中,最长的回文子序列

状态转移方程

  • if s[i] == s[j], 那 dp[i][j] = dp[i + 1][j - 1] + 1;
    • 无效区间(越界), i + 1 < j : dp[i][i] = 字符个数;
  • if s[i] != s[j] (代表两端不会同时对构成回文子序列有帮助)
    • 去[i + 1, j] 和 [i, j - 1] 两个区间找: max(dp[i][j - 1], dp[i + 1][j]);

初始化:

  • 发现只有[0][0][i - 1][i - 1] 会越界(但是状态转移方程已经处理了)
    填表顺序

填表顺序

  • 看状态转移需要什么位置的 dp 值
    • 整体行: 从下到上(因为需要 i - 1),
    • 每一行内部: 从左往右(因为要 j - 1)

返回值

  • dp[0][n - 1];

代码:

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

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)


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

题目链接:https://leetcode.cn/problems/minimum-insertion-steps-to-make-a-string-palindrome/description/
在这里插入图片描述


优质解

思路:

  • 总体思路和上一题都差不多
  • 状态表示:dp[i][j][i, j]区间的子串,成为回文串的最小插入次数
  • 状态转移方程:s[i] == s[j]...不多说了,s[i] != s[j]...
  • 细节问题不说了

代码:

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

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

Ubuntu22.04.5 桌面版然后安装 VMware 17

安装 VMware 需要 GCC 12版本 标题通过 PPA 安装 这是最简单的方法&#xff0c;适用于大多数 Ubuntu 版本。 步骤 1&#xff1a;添加 PPA 仓库 sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt…

深入解析 MySQL 架构:从基础到高级

MySQL 是一款广泛使用的开源关系型数据库管理系统&#xff0c;以其高性能、可靠性和灵活性而闻名。无论是小型创业公司还是大型企业&#xff0c;MySQL 都是许多应用程序的首选数据库解决方案。本文将深入探讨 MySQL 的架构设计&#xff0c;帮助读者更好地理解其内部工作机制&am…

BACnet协议移植适配实现BACnet/IP和BACnet MSTP相关功能

1、从GitHub或者其他网站下载最新的协议栈源码 源码结构如图所示&#xff1a; 其中src是协议栈源码&#xff0c;可直接拿来使用&#xff0c;apps里面是一些功能的应用示例&#xff0c;有BACnet IP&#xff0c;BACnet MSTP&#xff0c;BACnet Router等功能。 2、协议栈移植完成…

Ubuntu 22.04.1 LTS 离线安装Docker(最快方法,仅需一个压缩文件和两个脚本)

作者亲测&#xff1a;亲测有效无bug。 利用ubuntu22.04下载完docker-27.4.1.tgz,然后按照下面方法安装。选择sudo方法。 tips:这个ubuntu22.04是迁移后的服务器的版本&#xff0c;不是迁移前的版本。 下载 下载地址 : https://download.docker.com/linux/static/stable/x86_…

Tkinter --按钮点击事件应用场景

第二章 事件处理 目录 第二章 事件处理 四、事件处理 4.1 按钮点击事件 4.1.1信息展示类场景 1. 静态文本说明 ​编辑 2. 动态状态显示 4.1.2.界面美化与装饰 1. 图像 / 图标展示 ​编辑 2. 分隔与布局辅助 4.1.3 交互反馈与提示 1. 操作结果提示 2. 帮助与说明文本…

计算机网络学习笔记:TCP流控、拥塞控制

文章目录 前言一、TCP流量控制1.1、案例&#xff1a;三次流量控制1.2、持续计时器 二、TCP拥塞控制2.1、拥塞控制的指标2.2、慢开始算法和拥塞避免算法2.3、快重传算法和快恢复算法2.4、练习 三、TCP拥塞控制与网际层拥塞控制总结 前言 TCP协议中的流量和拥塞&#xff0c;是两个…

【Linux】Tomcat搭建

前言 Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 JSP JSP是一种跨平台的动态网页技术标准&#xff0c;可以…

Ajax 核心知识点全面总结

文章目录 Ajax 核心知识点全面总结一、Ajax 基础概念1、定义2、核心特点 二、Ajax 工作原理与核心组件1、工作流程2、XMLHttpRequest&#xff08;XHR&#xff09;对象 三、Ajax 请求方法与参数1、常见请求方法2、请求参数处理 四、Ajax 异步与错误处理1、异步处理2、错误处理 五…

SpinFlowSim:用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架|文献速递-深度学习医疗AI最新文献

Title 题目 SpinFlowSim: A blood flow simulation framework for histology-informeddiffusion MRI microvasculature mapping in cancer SpinFlowSim&#xff1a;用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架 01 文献速递介绍 在扩散磁共振成像&#xff08…

量化面试绿皮书:21. 抛硬币游戏

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 21. 抛硬币游戏 两个赌徒正在玩一个抛硬币游戏。 赌徒A有(n1)枚均匀硬币&#xff0c;赌徒B有n枚均匀硬币。 Q: 如果两人同时抛掷所有硬币&a…

OpenLayers 框架体系

注&#xff1a;当前使用的是 ol 9.2.4 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key OpenLayers框架组织结构庞大&#xff0c;只通过官网API进行查看&#xff0c;对框架结构缺少一个整体、全面的看法。借助树形结构图或思维导图&#xff0…

缓存系统-基本概述

目录 一、系统概述 二、名词解释 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、读写模式 1、Cache Aside&#xff08;旁路缓存&#xff09; 2、Write Through&#xff08;直写&#xff09; 3、Write Back&#xff08;回写&#xff09; 五、问题方案 …

基于GNU Radio Companion搭建的BPSK收发通信实验

目录 一、实验目的和要求 二、实验内容 1.Lab5 仿真设计一个BPSK的数字收发射系统 Lab6 实际使用RTLSDR解调BPSK信号 一、实验目的和要求 1.了解软FM的工作方式和原理,数字通信的码间串扰及星座图 2.掌握并正确使用RTL-SDL硬件和Gnuradio软件 3.正确使用Gnraduo软件,建…

华为OD机试-返回矩阵中非1的元素、个数/数值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩阵中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…

Redis学习笔记——黑马点评 消息队列25-30

前言&#xff1a; 学习收获&#xff1a; Redis消息队列&#xff1a; 消息队列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的队列。最简单的消息队列包括3个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理生…

基于Django+Vue3的草莓病害检测系统设计与实现,Web前后端分离,YOLOv8 Web目标检测系统

这里写自定义目录标题 基于DjangoVue3的草莓病害检测系统 基于DjangoVue3的草莓病害检测系统 本项目结合 YOLOv8 与 Django Vue3 &#xff0c;构建了一个通用的 Web 前后端系统&#xff0c;便于用户进行目标检测的操作和展示&#xff0c;实现对图片、视频实时目标检测和摄像头…

【MFC】树控件的使用详解

目录 添加线条链接 添加折叠小按钮 设置树控件的节点和对应的图标 设置默认选中项 设置选中项切换响应函数 涉及接口介绍&#xff1a; 首先我们通过资源视图可以添加一个树形控件&#xff0c;如下&#xff1a; 添加线条链接 在树形控件中&#xff0c;有一个属性“Has…

跨境卖家警报。抽绳背包版权案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.对其热销的抽绳设计多功能运动背包发起跨境版权维权&#xff0c;保护范围涵盖产品外观设计。 案件基本情况&#xff1a; 起诉时间&#xff1a;2025-6-12 案件号&#xff1a;25-cv-06509 原…

Android Activity全面解析:从创建到生命周期的完整指南

Activity作为Android四大组件之一&#xff0c;是构建用户界面的核心单元。笔者通过郭霖著的第一行代码入门安卓&#xff0c;内容基本都取自书中&#xff0c;这篇博客作为笔者的笔记同时精简了一些书中内容分享在csdn中 一、Activity的创建与基础配置 1.1 创建Activity的基本步…

深入理解 Python 的 secrets 模块:打造更安全的随机数生成机制

深入理解 Python 的 secrets 模块&#xff1a;打造更安全的随机数生成机制 在构建涉及用户身份认证、权限管理、加密通信等系统时&#xff0c;开发者最不能忽视的一个问题就是“安全性”。安全问题的核心之一在于“随机性”——尤其是密码、验证码、Token、Session、API Key 的…