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

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

示例 1:

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

输入:s = "a"
输出:0
示例 3:

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

提示:

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

这道题是“求一个字符串的所有 ”回文串 那道题的拓展。如何求某个字符串的所有回文子串(或者是说求字符串最长回文子串是多长),用到了DP,也就是一个典型分阶段求最值问题:

1.首先对于求字符串所有回文串

明确状态转移方程:p(i,j)表示字符串从i开始到j结束是否为回文串,这里包括字符i和j

p(i,j) = p(i+1,j-1)  (s[i]==s[j])

当字符串长度为1或者2的时候,

i==j :p(i,j) = 1

i==j-1: p(i,j) = 1 且s[i]=s[j] p(i,j) = 0 且s[i]!=s[j]

也就是说通过长度控制,推导

def getAllPaliSubstr(s): N = len(s)dp = []for i in range(N):dp.append([0]*N)for length in range(1,N+1):for i in range(N-length+1):j = i+length-1# print i,jif length==1:dp[i][j] = 1if length==2 and s[i]==s[j]:dp[i][j] = 1if length>2 and dp[i+1][j-1]==1 and s[i]==s[j]:dp[i][j] = 1

2.在回文串中有多少种切割方案

利用DFS,对DP数组求记录,这里也就是针对DP数组,找出所有能从i,到N的路径,通过回溯完成.

时间复杂度:若字符串s中n个字符都相同,则有2^n种划分方法,其中每种划分方法需要遍历n次。时间复杂度为O(n*2^n)。另外动态规划求DP的时间复杂为O(N^2)。总的时间复杂度为O(N*2^N)

空间复杂度:动态规划求DP的复杂度O(N^2)

def dfs(N,s,dp,i,res,tmp):if i==N:res.append(tmp[:])for j in range(N):if dp[i][j]==1:tmp.append(s[i:j+1])dfs(N,s,j+1,res,tmp) #这里下一次从j+1开始,表示前一个回文串最后一个位置的下一个位置tmp.pop()

3.求最少分割次数:

这也就是Leetcode132这道题,刚开始还是想通过dfs进行求解,但是会超时,分析一下,如果不对dfs做剪枝处理,其时间复杂度O(2^N),远超问题1中O(N^2)的时间复杂度

于是,还是通过动态规划进行求解。

f[i]数组表示第i位置下,最少分割次数,这里可以包含两种情况

一:s[0,i+1]是回文串,也就是dp[0][i]=1,f[i]=0

二:s[j+1,i+1]是回文串,其中0<=j<i,f[i] = min(f[j]+1,f[i])

for i in range(N):if dp[0][i]==1:f[i] = 0else:for j in range(i):if dp[j+1][i]==1:f[i] = min(f[j]+1,f[i])

最终代码:

class Solution(object):def minCut(self, s):""":type s: str:rtype: int"""#复杂度分析:求dp和f数组都是O(N^2)#空间复杂度:需要一个O(N^2)的数组N = len(s)dp = []for i in range(N):dp.append([0]*N)for length in range(1,N+1):for i in range(N-length+1):j = i+length-1# print i,jif length==1:dp[i][j] = 1if length==2 and s[i]==s[j]:dp[i][j] = 1if length>2 and dp[i+1][j-1]==1 and s[i]==s[j]:dp[i][j] = 1if i==0 and j==N-1 and dp[i][j]==1:return 0f = [2000]*Nfor i in range(N):if dp[0][i]==1:f[i] = 0else:for j in range(i):if dp[j+1][i]==1:f[i] = min(f[j]+1,f[i])return f[N-1]

【132】求把字符串分割成回文串的最少切分次数相关推荐

  1. 力扣--让字符串成为回文串的最少插入次数

    力扣–让字符串成为回文串的最少插入次数 文章目录 力扣--让字符串成为回文串的最少插入次数 一.题目描述 二.分析 三.代码 相关题目: 腾讯–构造回文:腾讯–构造回文 最长回文子串和回文链表:最长回 ...

  2. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数

    题目描述(难度困难) 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符.请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字符串. 示例 1: 输入: ...

  3. LeetCode 1312. 让字符串成为回文串的最少插入次数(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符. 请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字 ...

  4. java字符串最长回文串_Java中的字符串回文程序

    java字符串最长回文串 Given a string and we have to check whether it is palindrome string or not. 给定一个字符串,我们必 ...

  5. c语言判断回文字符串递归,用递归实现判断一个字符串是否为回文串

    //用递归实现判断一个字符串是否为回文串 import java.util.Scanner; public class Palindrome { //判断是否为回文串 in型参数代表字符串起止位置 p ...

  6. 判断字符串是否为回文串

    判断字符串是否为回文串 判断回文数(双指针法) 常规解法 public boolean IsPalindrome1(String A){char[] arrayA = A.toCharArray(); ...

  7. 第3关:利用栈判断字符串是否为回文串

    #ifndef stack__h #define stack__h#include <stdio.h> #include <stdlib.h>typedef char T; / ...

  8. 数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)

    回文串为首尾对称的字符串: 如a,aba,abba等 单链表思路 1.将字符读入链表 2.找到链表中点 3.将链表从中点断开成2条,将后半条反转 4.比较两条链表是否相等(比较次数以少的为准(长度为奇 ...

  9. HDU6599:求本质不同的子串(回文串)长度及数量

    目录 hdu6599题意: manacher+后缀自动机+倍增 \(O(nlog(n))\) manacher+后缀数组+二分 \(O(nlog(n))\) 回文树(回文自动机) \(O(n)\) @ ...

最新文章

  1. cmakelist官方教程_CMakeLists.txt文件如何编写?(一 基础篇)
  2. 学习_你必须知道的.net2_第四章_一切从IL开始
  3. mysql不需要安装_MySQL免安装版 配置
  4. main函数执行前执行一个函数的写法
  5. 已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
  6. 微软官方反间谍流氓软件WindowsDefender
  7. 关于SVN 目录结构
  8. 如何查看 SAP Fiori Elements List Report Table 都支持哪些设置
  9. spring----Bean的生命周期和循环依赖
  10. dedecms 添加,编辑文章时 文章标题有字数限制的解决办法。
  11. 2020年中国视频内容电商行业白皮书
  12. rabbitmq延迟队列相关
  13. DrawPrimitiveUP And DrawIndexedPrimitiveUP
  14. echarts曲线太多卡顿怎么优化_光刻胶旋涂曲线如何获得?
  15. python之OrderedDict类
  16. Http协议简易分析
  17. IB网卡驱动安装以及Infiniband连接带宽测试
  18. 计算机g级的存储是,客户说他的电脑高端,支持480G内存与16G显卡升级,有谁见过?...
  19. 服务器固态硬盘跟机械硬盘之间差别是什么?
  20. GRE 词汇2(词根)

热门文章

  1. MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志
  2. 关于虚拟专用网的一些概念
  3. 7.4 小团队、低成本的管理实践之路
  4. 百度地图搜索功能的实现
  5. Oracle数据库中分区表的操作方法
  6. 游戏行业比影视行业哪个更有前景?来看数据说话!
  7. 北航计算机学院王华峰,软件学院学术论坛第四次宣讲会
  8. WT588D语音芯片介绍
  9. 如何查看自己加入过的微信群
  10. PHP最佳实践指南(中英对照)