问题描述

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。

返回符合要求的 最少分割次数 。

示例 1:

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

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1

提示:

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

解题思路

设 f[i]表示字符串的前缀 s[0…i]的最少分割次数。要想得出 f[i] 的值,我们可以考虑枚举 s[0…i]分割出的最后一个回文串,这样我们就可以写出状态转移方程:

即我们枚举最后一个回文串的起始位置 j+1,保证 s[j+1…i]是一个回文串,那么 f[i]就可以从 f[j]转移而来,附加 1次额外的分割次数。

注意到上面的状态转移方程中,我们还少考虑了一种情况,即 s[0…i]本身就是一个回文串。此时其不需要进行任何分割,即:

f[i]=0

那么我们如何知道 s[j+1…i]或者 s[0…i]是否为回文串呢?我们可以使用与leetcode题解5-最长回文子串中相同的预处理方法,将字符串 ss 的每个子串是否为回文串预先计算出来,即:

代码实现

class Solution {public boolean f[][];     //判断以i为起点,j为终点的字符串是否是回文串public int n;             //字符串s的长度public int dp[];          //dp[i]表示以i为最后一个元素的子字符串的最少分割次数public int minCut(String s) {n=s.length();//按最长回文子串的思路填充f[][]f=new boolean[n][n];if(n==0 || n==1){return 0;}char []cs=s.toCharArray();for(int i=0;i<n;i++){for(int j=0;j<=i;j++){if(i-j<=1){if(cs[i]==cs[j]){f[j][i]=true;}}else{if(cs[i]==cs[j] && f[j+1][i-1]==true){f[j][i]=true;}}}}dp=new int[n];//计算以每个元素为后缀的子字符串的最少分割次数for(int i=0;i<n;i++){dp[i]=i;    //最坏情况下,默认每个字符都要分割//如果从第一个元素一直到最后一个元素都是回文子串,那么最少分割次数是0if(f[0][i]==true){  dp[i]=0;continue;}//否则的话,从前往后遍历,如果从j+1到i可以组成一个回文子串//那么最少分割次数就等于0到j的最少分割次数+1for(int j=0;j<i;j++){if(f[j+1][i]==true){dp[i]=Math.min(dp[j]+1,dp[i]);}}}//最终返回dp[n-1]return dp[n-1];}}

leetcode题解132-分割回文串 II相关推荐

  1. 132. 分割回文串 II

    链接:132. 分割回文串 II 题解:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/xiang-tong- ...

  2. LeetCode 132. 分割回文串 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...

  3. leetcode题解131-分割回文串

    问题描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = "aa ...

  4. 【LeetCode - 131】分割回文串(dp,dfs)

    题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/ 题目: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. ...

  5. leetcode132. 分割回文串 II

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s 分割成 [ ...

  6. 【数据结构与算法】之深入解析“分割回文串II”的求解思路与算法示例

    一.题目要求 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文,返回符合要求的最少分割次数. 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就 ...

  7. leetcode132. 分割回文串 II(dp)

    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s ...

  8. AK F.*ing leetcode 流浪计划之回文串

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 文章目录 一.简介 二.解题步骤 三.作用 四.经典算法介绍 判断一个串是否为回文串(单次查询) 普通情况 判断指定字符 多次子 ...

  9. LeetCode 1278. 分割回文串 III

    截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...

最新文章

  1. SpringCloud系列一:SpringCloud的简介和架构
  2. gdb调试报错:Missing separate debuginfos, use: debuginfo-install glibc-XXX
  3. Java基础 this关键字
  4. ArrayList基操
  5. ibm liberty_使用Open Liberty的开发模式最大程度地缩短周转时间
  6. 21 RadioGroup ListFragment
  7. PetShop之ASP.NET缓存 --one
  8. java 线程释放_如何手动释放一个java线程占用的资源
  9. Hadoop-RPC底层实现与解析
  10. 排查DHCP服务器故障
  11. SD-WAN的几种典型部署和实践
  12. 2019软件测试最新视频教程大合集汇总
  13. oracle 去空格函数未生效,发现ASCII值为49824的字符
  14. 天敏G10数位板安装完PS无压感,观看此教程
  15. 【深度学习】眼底图像之视盘和黄斑分割的探索
  16. 大学里青年教师待遇真的很低吗?
  17. 计算机专业考计量经济学,计量经济学期末考试题库(完整版)及答案()(47页)-原创力文档...
  18. K均值算法(继续优化中)
  19. 如何选择CDN?你需要关注这三个方面
  20. 【算法】求解最大连续子序列和的问题

热门文章

  1. 突然!锤子科技天猫官方旗舰店商品全线下架 店铺撤店?!
  2. 5G手机还没普及 LG电子就已着手研发6G
  3. 晨哥真有料丨到底合适重要,还是感觉重要!
  4. oracle logical standby,Oracle10gR2 Logical Standby(一)概念与原理
  5. 基于TCP协议用多线程实现并发服务器,实现思路、算法和demo
  6. oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型
  7. mgr未同步 mysql_MySQL MGR如何修复数据不一致的节点
  8. 【java】Java运行时动态生成类几种方式
  9. 【Flink】Metrics运作机制
  10. 【Flink】Flink 报错 flink 1.12.5 启动作业报 partition not found