leetcode132. 分割回文串 II(java)

分割回文串 II

  • 分割回文串 II
    • 动态规划
  • 回文字符串

分割回文串 II

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。

示例 1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。

示例 2:
输入:s = “a”
输出:0

示例 3:
输入:s = “ab”
输出:1

提示:
1 <= s.length <= 2000
s 仅由小写英文字母组成

动态规划

对于长度为n的字符串,我们用[1,n]来表示。也就是下标从0开始。
我们首先先用动态规划的思想,计算出字符串中有多少个回文字串。
我们用双指针的技巧,一个指针卡住左边l,一个指针卡住右边r。然后递归去计算[l,r]范围内是否是回文字符串。我们用boolean[l][r] 来标记l到r范围,是不是回文串。

动态规划就是要去找到状态转移方程。
首先想到,如果l == r 只有一个元素,肯定是回文串,g[l][r] = true;
如果r - l == 1时,说明只有两个长度,那么只要l上字符等于r上的字符,就说明是回文字符串。g[l][r] = true;
然后是一般性考虑。如果l上字符等于r上的字符 ,并且g[l + 1][r - 1]也是回文,那么整个范围都是回文,
因为:可以得到状态转移方程。
g[l][r] = r - l == 1 || g[l + 1][r - 1];

然后计算回文分割的长度:
我们定义f[r]为将[1,r] 这一段字符分割为若干回文串的最小分割次数,那么最终答案为f[n]。
不失一般性的考虑f[r]如何转移:
从「起点字符」到「第r 个字符」能形成回文串。那么最小分割次数为 0,此时有f[r] = 0 从「起点字符」到「第 r个字符」不能形成回文串。此时我们需要枚举左端点 l,如果[l,r] 这一段是回文串的话,那么有f[r] = f[l - 1] + 1
在 2中满足回文要求的左端点位置l 可能有很多个,我们在所有方案中取一个最小的 即可。

代码演示

 public int minCut(String s) {int n = s.length();char[] cs = s.toCharArray();// g[l][r] 代表 [l,r] 这一段是否为回文串boolean[][] g = new boolean[n + 1][n + 1];for (int r = 1; r <= n; r++) {for (int l = r; l >= 1; l--) {// 如果只有一个字符,则[l,r]属于回文if (l == r) {g[l][r] = true;} else {// 在 l 和 r 字符相同的前提下if (cs[l - 1] == cs[r - 1]) {// 如果 l 和 r 长度只有 2;或者 [l+1,r-1] 这一段满足回文,则[l,r]属于回文if (r - l == 1 || g[l + 1][r - 1]) {g[l][r] = true;}}}}}// f[r] 代表将 [1,r] 这一段分割成若干回文子串所需要的最小分割次数int[] f = new int[n + 1];for (int r = 1; r <= n; r++) {// 如果 [1,r] 满足回文,不需要分割if (g[1][r]) {f[r] = 0;} else {// 先设定一个最大分割次数(r 个字符最多消耗 r - 1 次分割)f[r] = r - 1;// 在所有符合 [l,r] 回文的方案中取最小值for (int l = 1; l <= r; l++) {if (g[l][r]) f[r] = Math.min(f[r], f[l - 1] + 1);}   }}return f[n];}

回文字符串

leetcode131. 分割回文串

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

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

相关文章

git使用教程

一 创建环境 参考 Git 安装配置 | 菜鸟教程 (runoob.com)https://www.runoob.com/git/git-install-setup.html 1.1 配置 $ git config --global user.name "runoob" $ git config --global user.email test@runoob.com 1.2 创建一个新文件夹 在新的文件夹执行(…

C++中的头文件.h 和 源文件.cpp 的关系

在VS中 C项目&#xff0c;我创建了一个类&#xff0c; 会自动创建头文件和源文件&#xff0c;这两个文件有什么关系&#xff1f; 如何快速切换&#xff1f;在头文件.h文件中声明的类方法&#xff0c; 如何快速在源文件中进行具体实现&#xff1f;在 Visual Studio 中创建 C 项…

多级调度在工程中的应用及思路

多级调度在工程中的应用及思路 集中式多机调度 顾名思义&#xff1a;集中式多机调度就是指&#xff0c;机器的数据是集中的&#xff0c;有统一的控制中心调度&#xff0c;类似于现实中的机场调度中心&#xff0c;铁路调度中心&#xff0c;一般机器将定位&#xff0c;速度&…

文件上传漏洞总结2

文件上传的大体都已经学习过了 这个假期在给他强化一下 什么是webshell webshell是web入侵的脚本攻击工具。webshell就是一个asp或php木马后门&#xff0c;黑客在入侵了一个网站后&#xff0c;常常在将这些asp或php木马后门文件放置在网站服务器的web目录中&#xff0c;与正常…

HTML5的应用现状与发展前景

HTML5&#xff0c;作为Web技术的核心&#xff0c;已经深深地改变了我们看待和使用Web的方式。它不仅提供了数不尽的新特性和功能&#xff0c;还使得Web设计和开发更加互动、更加直观。这篇文章将探讨HTML5的当前应用现状&#xff0c;以及它的未来发展前景。 HTML5的应用现状 H…

HDU-7323 2023“钉耙编程”杭电多校赛(3)a-b Problem

HDU-7323 2023“钉耙编程”杭电多校赛&#xff08;3&#xff09;a-b Problem 题目大意 小 A A A和小 B B B在玩游戏。有 n n n块石头&#xff0c;小 A A A和小 B B B轮流捡&#xff0c;小 A A A先捡。每人每次只能捡一块石头&#xff0c;直到所有的石头都被捡完。 每块石头都…

【linux升级ssh】 利用rpmbuild工具对ssh打包为rpm包进场安装升级

制作rpm包 rpmbuild命令用于创建软件的二进制包和源代码包。 官方文档&#xff1a;rpm.org - RPM Reference Manual rpmbuild 中文手册&#xff1a;rpmbuild 中文手册 [金步国] 使用rpmbuild将tar包打成rpm包 RPM打包使用的是rpmbuild命令&#xff0c;这个命令来自rpm-buil…

二、深入浅出WPF之系统学习XAML语法

二、系统学习XAML语法 2.1 Xaml的树形结构 跟Winforms一样,UI也是个平面结构,与winforms的设计思维不同,WPF使用树形逻辑来描述UI,下面是UI布局的简单代码 <StackPanel Background="LightBlue"><TextBox x:Name="textBox1" Margin="5&q…

本地缓存LoadingCache

引入依赖 <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.1-jre</version> </dependency>主要代…

(三)InfluxDB入门(借助Web UI)

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 3 章 InfluxDB入门&#xff08;借助Web UI&#xff09; 借助Web UI&#xff0c;我们可以更好地理解InfluxD…

C语言入门篇(八)

前言   本篇分享的是部分操作符的概念与用法&#xff0c;从经典例题入手&#xff0c;带你快速了解和掌握。   收录专栏&#xff1a;浅谈C语言 操作符详解上 1. 操作符分类2. 算术操作符3. 移位操作符3.1 左移操作符3.2 右移操作符 4. 位操作符5. 赋值操作符6. 单目操作符6.…

Excel双向柱状图的绘制

Excel双向柱状图在绘制增减比较的时候经常用到&#xff0c;叫法繁多&#xff0c;双向柱状图、上下柱状图、增减柱状图都有。 这里主要介绍一下Excel的基础绘制方法和复杂一点的双向柱状图的绘制 基础双向柱状图的绘制 首先升降的数据如下&#xff1a; 月份上升下降20220359-…

如何创建高级 CSS 下拉菜单

效果展示 实现思路及部分代码 1、定义整体页面结构 从上述的效果展示图可以看出&#xff0c;页面的整体结构应该需要一个总菜单容器来装载父级菜单项&#xff0c;并且对应的父级菜单项应该有对应的菜单子项。子菜单是分类的话&#xff0c;我们还需要额外在扩展对应的容器来装…

代码随想录算法训练营day11 | 20. 有效的括号,1047. 删除字符串中的所有相邻重复项

目录 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 难度&#xff1a;easy 类型&#xff1a;栈与队列 思路&#xff1a; 利用栈来做括号匹配&#xff1b; 代码&#xff1a; class Solution {public boolean isValid(String…

Django全局捕获view函数中的所有异常、Python中获取异常(Exception)信息

文章目录 一、Django全局捕获view函数中的所有异常1. 使用中间件2. 使用视图装饰器3. DRF(Django REST framework)全局异常处理【重要】在 Django 中,self.get_response(request) 返回的是一个处理过的响应对象4. Django全局捕获view函数中的所有异常 演示demo二、Python中获取…

Unity UGUI的RectMask2D(2D遮罩)组件的介绍及使用

Unity UGUI的RectMask2D&#xff08;2D遮罩&#xff09;组件的介绍及使用 1. 什么是RectMask2D组件&#xff1f; RectMask2D是Unity UGUI中的一个组件&#xff0c;用于实现2D遮罩效果。它可以限制子对象在指定的矩形区域内显示&#xff0c;超出区域的部分将被遮罩隐藏。 2. …

Flutter 最佳实践和编码准则

Flutter 最佳实践和编码准则 视频 前言 最佳实践是一套既定的准则&#xff0c;可以提高代码质量、可读性和可靠性。它们确保遵循行业标准&#xff0c;鼓励一致性&#xff0c;并促进开发人员之间的合作。通过遵循最佳实践&#xff0c;代码变得更容易理解、修改和调试&#xff…

【新日语(2)】第4課 人びとの生活をもっと豊かにしなければなりません

第4課 人びとの生活をもっと豊かにしなければなりません 注释&#xff1a; 人びと&#xff1a;人们。しなければなりません&#xff1a;必须让。动词「する」的否定条件式助动词「なる」的否定敬体终止形&#xff1b;しなければ&#xff1a;する ない&#xff0b;れば、「す…

vue中Cascader 级联选择器实现-修改实现

vue 的cascader研究了好长时间&#xff0c;看了官网给的示例&#xff0c;上网查找了好多信息&#xff0c;才解决修改时回显的问题&#xff0c;现将方法总结如下&#xff1a; vue代码&#xff1a; <el-form-item label"芯片" prop"firmware"> <…

vue3-简单登录认证前端实现样例

登录页面 登录页面需要与业务功能页面独立开&#xff0c;请参考《多级路由》一文。 登录框 一个简单的登录页面代码如下所示&#xff0c;需包含用户名、密码的输入框&#xff0c;登录按钮等基础组件&#xff0c;可根据需要进行美化。 <template><div style"d…