【132】求把字符串分割成回文串的最少切分次数
给你一个字符串 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】求把字符串分割成回文串的最少切分次数相关推荐
- 力扣--让字符串成为回文串的最少插入次数
力扣–让字符串成为回文串的最少插入次数 文章目录 力扣--让字符串成为回文串的最少插入次数 一.题目描述 二.分析 三.代码 相关题目: 腾讯–构造回文:腾讯–构造回文 最长回文子串和回文链表:最长回 ...
- leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数
题目描述(难度困难) 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符.请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字符串. 示例 1: 输入: ...
- LeetCode 1312. 让字符串成为回文串的最少插入次数(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符. 请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字 ...
- java字符串最长回文串_Java中的字符串回文程序
java字符串最长回文串 Given a string and we have to check whether it is palindrome string or not. 给定一个字符串,我们必 ...
- c语言判断回文字符串递归,用递归实现判断一个字符串是否为回文串
//用递归实现判断一个字符串是否为回文串 import java.util.Scanner; public class Palindrome { //判断是否为回文串 in型参数代表字符串起止位置 p ...
- 判断字符串是否为回文串
判断字符串是否为回文串 判断回文数(双指针法) 常规解法 public boolean IsPalindrome1(String A){char[] arrayA = A.toCharArray(); ...
- 第3关:利用栈判断字符串是否为回文串
#ifndef stack__h #define stack__h#include <stdio.h> #include <stdlib.h>typedef char T; / ...
- 数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)
回文串为首尾对称的字符串: 如a,aba,abba等 单链表思路 1.将字符读入链表 2.找到链表中点 3.将链表从中点断开成2条,将后半条反转 4.比较两条链表是否相等(比较次数以少的为准(长度为奇 ...
- HDU6599:求本质不同的子串(回文串)长度及数量
目录 hdu6599题意: manacher+后缀自动机+倍增 \(O(nlog(n))\) manacher+后缀数组+二分 \(O(nlog(n))\) 回文树(回文自动机) \(O(n)\) @ ...
最新文章
- cmakelist官方教程_CMakeLists.txt文件如何编写?(一 基础篇)
- 学习_你必须知道的.net2_第四章_一切从IL开始
- mysql不需要安装_MySQL免安装版 配置
- main函数执行前执行一个函数的写法
- 已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
- 微软官方反间谍流氓软件WindowsDefender
- 关于SVN 目录结构
- 如何查看 SAP Fiori Elements List Report Table 都支持哪些设置
- spring----Bean的生命周期和循环依赖
- dedecms 添加,编辑文章时 文章标题有字数限制的解决办法。
- 2020年中国视频内容电商行业白皮书
- rabbitmq延迟队列相关
- DrawPrimitiveUP And DrawIndexedPrimitiveUP
- echarts曲线太多卡顿怎么优化_光刻胶旋涂曲线如何获得?
- python之OrderedDict类
- Http协议简易分析
- IB网卡驱动安装以及Infiniband连接带宽测试
- 计算机g级的存储是,客户说他的电脑高端,支持480G内存与16G显卡升级,有谁见过?...
- 服务器固态硬盘跟机械硬盘之间差别是什么?
- GRE 词汇2(词根)