[程序员代码面试指南]字符串问题-回文最少分割数(DP)
问题描述
给定一个字符串,输出把它全部切成回文子串的最小分割数。
例:str="ACDCDCDAD",输出2。
解题思路
DP
存储结构
- dp数组dp[len+1],dp[i]表示子串str[i:len]至少需要切割几次,才能都切割成回文串。对应的,循环从右至左进行。
- 注意 dp[i]的含义完全可以做对称更改,循环也变为从前向后即可。
- 此外,为了保证
int cutTime=dp[j+1]+1;//句的顺利执行,且dp[len-1]=0,palStr=true.dp数组多开一位,并初始化其为-1。
- 二维boolean数组palStr[len][len]描述str[i:j+1]是否是回文串
状态转移方程
遍历j从i到len-1,若j到len-1是回文串,则dp[i]=dp[j+1]+1是候选最优解之一。故有dp[i]=min{dp[j+1]+1},i<=j<=len-1且palStr[i+1][j-1]=true。
判断回文子串
- 三种情况:str只有一个字符/str有两个字符且相等/str[i+1][j-1]为回文串且str[i]==str[j],这三种情况可合并写为
str[i]==str[j]&&(j-i<=1||palStr[i+1][j-1]) - 注意:我们需要在求palStr[I][j]的时候已知palStr[I+1][j+1]的值,根据dp[i]的含义及对应的循环顺序,我们可以保证该条件。经尝试,内部j的循环方向是无所谓的。
代码 时间复杂度O(n^2)
public class Main {
public static void main(String args[]) {
String str="acdcdcdad";
int time=cutTimes(str);
System.out.println(time);
}
public static int cutTimes(String str) {
if(str==null||str=="") {
return 0;
}
int len=str.length();
int[] dp=new int[len+1];//
dp[len]=-1;//
boolean[][] palStr=new boolean[len][len];
for(int i=0;i<len;++i) {
for(int j=0;j<len;++j) {
palStr[i][j]=false;
}
}
for(int i=len-1;i>=0;--i) {
dp[i]=Integer.MAX_VALUE;
for(int j=i;j<len;++j) {
// for(int j=len-1;j>=i;--j) {
if(str.charAt(i)==str.charAt(j)&&(j-i<=1||palStr[i+1][j-1])) {
palStr[i][j]=true;
int cutTime=dp[j+1]+1;//
if(cutTime<dp[i]) {
dp[i]=cutTime;
}
}
}
}
return dp[0];
}
}
[程序员代码面试指南]字符串问题-回文最少分割数(DP)的更多相关文章
- [程序员代码面试指南]字符串问题-字符串匹配问题(DP)
问题描述 字符串str,模式串exp. 必须保证str中无'.'和'星号'字符,并且exp中'星号'不出现在首位,且无连续两个'星号'.PS星号是字符只是暂时没找到markdown的星号转义字符. ' ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...
- [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0 ...
- 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串
题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...
- [程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)
题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp ...
- [程序员代码面试指南]递归和动态规划-最小编辑代价(DP)
问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把s ...
- [程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)
问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状 ...
随机推荐
- 使用动态链接为什么还需要静态库lib文件
在Windows上使用动态链接时,不光需要头文件 .dll文件 还需要一个.lib 文件. 不是动态链接吗?为什么还需要静态库.lib文件? 实际上,这个.lib文件并不是静态库,而是 导入库 文件, ...
- 区分多个web driver实例
固然可以用加载不同cookie的办法,让3个帐号共享一个web driver登陆,但总感觉切换麻烦,干脆用了3个web driver实例.问题来了,如何区分?不是说程序里如何区分,机器比人聪明,知道外 ...
- Python3 执行JS出现JSON未定义问题
two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...
- mysql join update
SELECT CONCAT('UPDATE free_for_demo_orders SET product_id=',product_id,',order_created_time=','&quo ...
- Go Channel 详解
原文链接:Go Channel 详解 Channel类型 Channel类型的定义格式如下: ChannelType = ( "chan" | "chan" & ...
- 《p5.js创意游戏编程》第一课:跳动的小球
准备:Hbuilder/vscode等可以编写网页的编辑器 如果想立刻上手也可以使用在线编译器p5.js官方在线编辑器,如果打不开也可以使用国内的一款在线编辑器jsrun编辑器,(第一课先使用jsru ...
- 如何在Linux上使用xargs命令
大家好,我是良许. 在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令.xargs 可以将一个命令的输出 ...
- 《Java从入门到失业》第三章:基础语法及基本程序结构(四):基本数据类型(字符编码和char型)
3.6.4字符编码 咦?怎么好像有东西乱入了?不是讲基本数据类型么?哈哈,因为还剩下最后一个char型了,因为char型会牵涉到Unicode编码相关,因此我决定先科普一下字符集编码. 我儿子现在上小 ...
- Fiddler扩展——导出Jmeter脚本
前言 Fiddler,对于大家而言,应该早已耳熟能详,是个抓包神器,具体的使用,我就不多说了.如果对Fiddler的使用还不太熟练,可以翻看我以前一系列的博文.我罗列出来,方便大家阅读,如下所示: 1 ...
- composer安装依赖包时,php内存分配不足
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in pha ...