动态规划-回文子串问题

文章目录

  • 1. 回文子串(647)
  • 2. 最长回文子串(5)
  • 3. 分割回文串 IV(1745)
  • 4. 分割回文串 II(132)
  • 5. 最长回文子序列(516)
  • 6. 让字符串成为回文串的最少插入次数(1312)


1. 回文子串(647)

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

状态表示:
设置一个布尔类型二维数组dp,使用dp[i][j]来表示在i和j这个闭区间内的子串是否为回文子串。
状态转移方程:
当i和j位置的元素相同时分为三种情况,第一种是i等于j,第二种就是i+1等于j,第三种是就是除了i和j位置的元素还包含中间很多元素,那么dp[i][j]=dp[i+1][j-1]。
初始化:
这里无需初始化,都赋为false即可。
填表顺序:
填表要使用到两层循环,从左至右,从上到下。
返回值:
返回值就是返回dp数组中为true的个数。
代码如下:

class Solution {public int countSubstrings(String s) {int n = s.length();boolean[][] dp = new boolean[n][n];int ret = 0;for (int j = 0; j < n; j++) {for (int i = 0; i <= j; i++) {if (s.charAt(i) == s.charAt(j)) {if (i == j) {dp[i][j] = true;} else if (i + 1 == j) {dp[i][j] = true;} else {dp[i][j] = dp[i + 1][j - 1];}if (dp[i][j]) {ret++;}}}}return ret;}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

2. 最长回文子串(5)

题目描述:
在这里插入图片描述
状态表示:
这题状态表示和上一题一致。
状态转移方程:
这题状态转移方程和上一题也是一致的。
初始化:
初始化就是全是false,即不用初始化。
填表顺序:
从左至右,从上到下。
返回值:
返回dp数组中值为true的元素的i和j坐标差值为最大值的子串。
代码如下:

 class Solution {public String longestPalindrome(String s) {int n = s.length();boolean[][] dp = new boolean[n][n];int startIndex = 0;int endIndex = 0;int max = Integer.MIN_VALUE;for (int j = 0; j < n; j++) {for (int i = 0; i <= j; i++) {if (s.charAt(i) == s.charAt(j)) {if (i == j) {dp[i][j] = true;} else if (i + 1 == j) {dp[i][j] = true;} else {dp[i][j] = dp[i + 1][j - 1];}}if (dp[i][j] && j - i + 1 > max) {max = j - i + 1;startIndex = i;endIndex = j;}}}return s.substring(startIndex, endIndex + 1);}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

3. 分割回文串 IV(1745)

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

状态表示:
这题的状态表示与前两题一致。
状态转移方程:
与前两题一致。
初始化:
与前两题一致。
填表顺序:
与前两题一致。
返回值:
这题的返回值有点特殊,需要使用两层循环,将两层循环的下标用来分割字符串s并且判断分割好的三个子串在dp表中的值是否为true,如果都为true最终返回就是true,如果遍历完成没有一次是true,那么就返回false。
代码如下:

class Solution {public boolean checkPartitioning(String s) {int n = s.length();boolean[][] dp = new boolean[n][n];for (int j = 0; j < n; j++) {for (int i = 0; i <= j; i++) {if (s.charAt(i) == s.charAt(j)) {if (i == j) {dp[i][j] = true;} else if (i + 1 == j) {dp[i][j] = true;} else {dp[i][j] = dp[i + 1][j - 1];}}}}for (int i = 0; i < n - 1; i++) {for (int j = i; j < n - 1; j++) {if (dp[0][i] && dp[i + 1][j] && dp[j + 1][n - 1]) {return true;}}}return false;}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

4. 分割回文串 II(132)

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

状态表示:
这里有两个动态数组,第一个sup二维数组用于辅助运算,思想和前面几题类似,就是判断i到j位置是否为一个回文子串。第二个一维的动态数组dp,dp[i]表示以i位置元素为结尾的子串可以被分割为多个回文子串的最小次数。
状态转移方程:
对于二位数组的状态转移方程我们不多赘述,前面几题用很多。对于一维数组的dp[i],如果0~i是一个回文子串,那么dp[i]的值就是0,另一种情况就是0到i不是一个回文子串,那么我们固定住i,利用一个循环来遍历i前面的元素使用j来表示,如果j到i是一个回文子串,那么更新dp[i]=Math.min(dp[i],dp[j-1]+1)。
初始化:
为了不影响运算,将dp数组全初始化为最大值。
填表顺序:
dp数组从左至右。
返回值:
因为要返回整个字符串的最小分割次数,所以直接返回dp[n-1]即可。
代码如下:

class Solution {public int minCut(String s) {int n = s.length();boolean[][] sup = new boolean[n][n];for (int j = 0; j < n; j++) {for (int i = 0; i <= j; i++) {if (s.charAt(i) == s.charAt(j)) {if (i == j) {sup[i][j] = true;} else if (i + 1 == j) {sup[i][j] = true;} else {sup[i][j] = sup[i + 1][j - 1];}}}}int[] dp = new int[n];for (int i = 0; i < n; i++) {dp[i] = Integer.MAX_VALUE;}for (int i = 0; i < n; i++) {if (sup[0][i]) {dp[i] = 0;} else {for (int j = i; j >= 1; j--) {if (sup[j][i]) {dp[i] = Math.min(dp[i], dp[j - 1] + 1);}}}}return dp[n - 1];}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

5. 最长回文子序列(516)

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

状态表示:
和第二题一致。
状态转移方程:
和第二题一致。
初始化:
和第二题一致。
填表顺序:
和第二题一致。
返回值:
这题和第二题就是一样的题目,只不过第二题要返回字符串,但是这里返回的只是长度。
代码如下:

class Solution {public int longestPalindromeSubseq(String s) {int n = s.length();boolean[][] dp = new boolean[n][n];int max = 1;for (int j = 0; j < n; j++) {for (int i = 0; i <= j; i++) {if (s.charAt(i) == s.charAt(j)) {if (i == j) {dp[i][j] = true;} else if (i + 1 == j) {dp[i][j] = true;} else {dp[i][j] = dp[i + 1][j - 1];}}if (dp[i][j] && j - i + 1 > max) {max = j - i + 1;}}}return max;}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

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

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

状态表示:
使用二位数组dp[i][j]表示在i和j区间的子串变成回文子串的最小插入次数。
状态转移方程:
分为两种情况,第一种i和j位置元素相等时,当i+1等于j时,dp[i][j]=0,当i等于j时,dp[i][j]=0,当i+1<j时,dp[i][j]=dp[i+1][j-1]。第二种情况当i和j位置元素不相等时,需要插入元素所以dp[i][j]=Math.min(dp[i+1][j],dp[i][j-1])+1;
初始化:
无需初始化。
填表顺序:
从下到上,从左至右。
返回值:
返回0到n-1的原字符串的最小分割次数即dp[0][n-1]。
代码如下:

class Solution {public int minInsertions(String s) {int n = s.length();int[][] dp = new int[n][n];for (int i = n - 1; i >= 0; i--) {for (int j = i; j < n; j++) {if (s.charAt(i) == s.charAt(j)) {if (i == j) {dp[i][j] = 0;} else if (i + 1 == j) {dp[i][j] = 0;} else {dp[i][j] = dp[i + 1][j - 1];}} else {dp[i][j] = Math.min(dp[i + 1][j], dp[i][j - 1]) + 1;}}}return dp[0][n - 1];}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

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

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

相关文章

Vue入门篇:样式冲突scoped,data函数,组件通信,prop data单向数据流,打包发布

这里写目录标题 1.组件的样式冲突scoped2.data函数3.组件通信1.两种组件关系分类和对应的组件通信方案2.父子通信方案的核心流程 4.prop & data、单向数据流5.打包发布6.打包优化:路由懒加载 1.组件的样式冲突scoped 默认情况:写在组件中的样式会全局生效→因此很容易造成多…

【Python从入门到进阶】53、Scrapy日志信息及日志级别

接上篇《52、CrawlSpider链接提取器的使用》 上一篇我们学习了基于规则进行跟踪和自动爬取网页数据的“特殊爬虫”CrawlSpider。本篇我们来学习Scrapy的日志信息及日志级别。 一、引言 1、日志在Scrapy中的重要性 在Scrapy框架中&#xff0c;日志扮演着至关重要的角色。日志…

十三、大模型项目部署与交付

1 硬件选型 CUDA 核心和 Tensor 核心 CUDA 核心&#xff1a;是NVIDIA开发的并行计算平台和编程模型&#xff0c;用于GPU上的能用计算&#xff0c;可做很多的工作。应用在游戏、图形渲染、天气预测和电影特效Tensor 核心&#xff1a;张量核心&#xff0c;专门设计用于深度学习…

前端开发框架Vue

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Vue概述 Vue.js&#xff08;简称Vue&#xff09;是由尤雨溪&#xff08;Evan You&#xff09;创建并维护的一款开源前端开发框架。Vue以其轻量级、易上手和高度灵活的特点&…

IoTDB 入门教程③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢&#xff1f;意思就是链表在物理结构上不一定是连续的&#xff0c;但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

24五一杯ABC题完整思路+可执行代码+可视化图表(1)

2024五一赛A题保姆级建模思路20页1-3问可执行代码后续成品论文各类可视化图表&#xff08;完整版资料在文章最后&#xff09; 处理第一问的代码 其余各题的代码如下&#xff1a; A题保姆级建模思路20页&#xff1a;&#xff08;手把手教你如何建模&#xff09; 高清图片如下&am…

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 &#xff08;一&#xff09;定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的&#xff1a;使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

面试常见 | 项目上没有亮点,如何包装?

很多技术人在公司用的老技术&#xff0c;而且很多都是搬业务代码且做枯燥乏味的CRUD&#xff0c;在面试提交简历或做自我介绍的时候并不突出&#xff0c;这种情况&#xff0c;如何破局&#xff1f; 首先不管你做的啥项目&#xff0c;全世界不可能只有你自己在做&#xff0c;比…

Tensorflow2.0笔记 - ResNet实践

本笔记记录使用ResNet18网络结构&#xff0c;进行CIFAR100数据集的训练和验证。由于参数较多&#xff0c;训练时间会比较长&#xff0c;因此只跑了10个epoch&#xff0c;准确率还没有提升上去。 import os import time import tensorflow as tf from tensorflow import keras …

附录6-5 黑马优购项目-我的与后端本地化

目录 1 我的 2 后端本地化 1 我的 tarbar我的 只有这两个页面 其中未登录页面中只有一键登录有用&#xff0c;其他都是写死的&#xff0c;一键登录的功能仅仅是切换到登录的页面 目前微信小程序和微信用户的信息是脱钩的&#xff08;之前的wx.getUserProfile与wx.getUs…

企业气候风险披露、报表词频、文本分析数据集合(2007-2022年)

01、数据介绍 企业气候风险披露是指企业通过一定的方式&#xff0c;将气候变化对其影响、自身采取的应对措施等信息披露出来。这有助于投资者更准确地评估企业价值&#xff0c;发现投资机会&#xff0c;规避投资风险。解企业在气候风险方面的关注度和披露情况。 可以帮助利益…

Django后台项目开发实战七

为后台管理系统换风格 第七阶段 安装皮肤包 pip install django-grappelli 在 setting.py 注册 INSTALLED_APPS [grappelli,django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.stat…

【yolov8】yolov8剪枝训练流程

yolov8剪枝训练流程 流程&#xff1a; 约束剪枝微调 一、正常训练 yolo train model./weights/yolov8s.pt datayolo_bvn.yaml epochs100 ampFalse projectprun nametrain二、约束训练 2.1 修改YOLOv8代码&#xff1a; ultralytics/yolo/engine/trainer.py 添加内容&#…

R语言4版本安装mvstats(纯新手)

首先下载mvstats.R文件 下载mvstats.R文件点此链接&#xff1a;https://download.csdn.net/download/m0_62110645/89251535 第一种方法 找到mvstats.R的文件安装位置&#xff08;R语言的工作路径&#xff09; getwd() 将mvstats.R保存到工作路径 在R中输入命令 source(&qu…

ctf web-部分

** web基础知识 ** *一.反序列化 在PHP中&#xff0c;反序列化通常是指将序列化后的字节转换回原始的PHP对象或数据结构的过程。PHP中的序列化和反序列化通过serialize()和unserialize()函数实现。 1.序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串…

创新指南|如何通过用户研究打造更好的人工智能产品

每个人都对人工智能感到兴奋&#xff0c;但对错过机会 (FOMO) 的恐惧正在驱使公司将人工智能嵌入到每个产品功能中。这可能会导致以技术为中心的方法&#xff0c;从而掩盖产品开发的基本目标&#xff1a;创建真正解决用户问题并满足他们需求的解决方案。本文将介绍通过用户研究…

HawkEye—高效、细粒度的大页管理算法

文章目录 HawkEye—高效、细粒度的大页管理算法1.作者简介2.文章简介与摘要3.简介(1).当时的SOTA系统概述LinuxFreeBSDIngensHawkEye 4.动机(1).地址翻译开销与内存膨胀(2).缺页中断延迟与缺页中断次数(3).多处理器大页面分配(4).如何测算地址翻译开销&#xff1f; 5.设计与实现…

大长案例 - 通用的三方接口调用方案设计

文章目录 引言身份验证防止重复提交数据完整性和加密回调地址安全事件响应可用性 设计方案概述1. API密钥生成2. 接口鉴权3. 回调地址设置4. 接口API设计 权限划分权限划分概述1. 应用ID&#xff08;AppID&#xff09;2. 应用公钥&#xff08;AppKey&#xff09;【&#xff08;…

安装VMware Tools报错处理(SP1)

一、添加共享文件 因为没有VMware Tools&#xff0c;所以补丁只能通过共享文件夹进行传输了。直接在虚拟机的浏览器下载的话&#xff0c;自带的IE浏览器太老了&#xff0c;网站打不开&#xff0c;共享文件夹会方便一点&#xff0c;大家也可以用自己的方法&#xff0c;能顺利上…