131. Palindrome Partitioning

一个字符串,通过不同的切分找到所有切分后的子字符串都是回文的可能性

substr使用的是坐标值,不使用.begin()、.end()这种迭代器

使用dfs,类似于subsets的题,每次判断要不要加入这个数

start每次是起始的位置,判断当前位置到起始位置是不是回文

class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string> > result;
if(s.empty())
return result;
vector<string> res;
int start = ;
partition(s,result,res,start);
return result;
}
void partition(string s,vector<vector<string>>& result,vector<string>& res,int start){
if(start == s.size()){
result.push_back(res);
return;
}
for(int i = start;i < s.size();i++){
if(!ispalindrome(s,start,i))
continue;
res.push_back(s.substr(start,i - start + ));
partition(s,result,res,i+);
res.pop_back();
}
} bool ispalindrome(string s,int start,int end){
while(start < end){
if(s[start++] != s[end--])
return false;
}
return true;
}
};

132. Palindrome Partitioning II

切分字符串,找到最小切分次数让所有的子字符串都是回文

这种方法是否回文和dp一起做了。dp[i]表示当前位置最小的切分次数。

每次先初始化先初始化为要切分i次,然后从前往后找,找到符合的然后更新最小值

class Solution {
public:
int minCut(string s) {
int n = s.size();
vector<int> dp(n);
vector<vector<bool> > flag(n,vector<bool>(n));
for(int i = ;i < n;i++){
dp[i] = i;
for(int j = ;j <= i;j++){
if(s[i] == s[j] && (i - j < ||flag[i-][j+])){
flag[i][j] = true;
dp[i] = j == ? :min(dp[i],dp[j-] + );
}
}
}
return dp[n-];
}
};

老方法,这种方法是把所有子串的回文串先存储起来,然后再进行dp

class Solution {
public:
int minCut(string s) {
int length = s.length();
if(length <= )
return ;
vector<vector<bool>> flag(length+,vector<bool>(length+));
for(int i = ;i <= length;i++){
flag[i][i] = true;
if(i < length){
if(s[i-] == s[i])
flag[i][i+] = true;
else
flag[i][i+] = false;
}
}
for(int j = ;j <= length-;j++){
for(int k = ;k <= length-j-;k++){
if(s[k-] == s[k+j] && flag[k+][k+j] == true)
flag[k][k+j+] = true;
else
flag[k][k+j+] = false;
}
}
vector<int> result(length+);
result[] = -;
for(int i = ;i <= length;i++){
result[i] = i-;
for(int j = i-;j >= ;j--){
if(flag[j+][i] == true){
if(result[j] + < result[i])
result[i] = result[j] + ;
}
}
}
return result[length];
}
};

leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II的更多相关文章

  1. LeetCode 131. 分割回文串(Palindrome Partitioning)

    131. 分割回文串 131. Palindrome Partitioning 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. LeetC ...

  2. leetcode 266.Palindrome Permutation 、267.Palindrome Permutation II

    266.Palindrome Permutation https://www.cnblogs.com/grandyang/p/5223238.html 判断一个字符串的全排列能否形成一个回文串. 能组 ...

  3. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  4. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  5. leetcode 54. Spiral Matrix 、59. Spiral Matrix II

    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...

  6. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  7. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  8. leetcode 280.Wiggle Sort 、324. Wiggle Sort II

    Wiggle Sort: 注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求. 解法一错误版本: 如果nums的长度是4,这种情况下nums[i+1]会越界.但是如果你用 ...

  9. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

随机推荐

  1. c# 封装 Request操作类

    /// <summary> /// 判断当前页面是否接收到了Post请求 /// </summary> /// <returns>是否接收到了Post请求</ ...

  2. Redis管道

    介绍 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.客户端请求会遵循以下步骤:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应并将结果返 ...

  3. debounce(防抖动函数)

    短时间内不重复触发一个事件 设置一个门槛值,表示两次 Ajax 通信的最小间隔时间.如果在间隔时间内,发生新的keydown事件,则不触发 Ajax 通信,并且重新开始计时.如果过了指定时间,没有发生 ...

  4. VSCode中怎么改变文件夹的图标

    昨天更新了VSCode后我的文件夹图标莫名其妙的没有了,变成了下图这样 看着真的让我难受的头皮发麻,本来打代码就头发少,难道非要让我变成秃头,不可能不可能,所以我找了找怎么解决 来,各位看官上眼 如图 ...

  5. 获取url参数的方法(web)

    //获取url参数的方法(web) function GetQueryString(name) {     var reg = new RegExp("(^|&)" + n ...

  6. 消除TortoiseSVN 检出到(checkout)桌面上显示一堆问号

    之前不小心直接将版本库的内容检出到桌面,后才发现桌面上的文件图标都变成了问号,新建文件夹也同样如此. 为了解决这个问题,采用如下方法(任何一个检出文件夹均可这样操作): 1.删除桌面隐藏的.SVN文件 ...

  7. python第三十五天-----作业完成--学校选课系统

    选课系统:角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含, ...

  8. Linux常用命令大全(新手入门)

    系统信息:  arch 显示机器的处理器架构(1)  uname -m 显示机器的处理器架构(2)  uname -r 显示正在使用的内核版本  dmidecode -q 显示硬件系统部件 - (SM ...

  9. HDMI驱动热插拔检测方法

    1. 使用poll机制 1.1 如何使用? a. open("/dev/HPD"); b. poll状态发生变化 c. read确定接上还是接下 1.2 情景分析: APP使用op ...

  10. 使用Tampermonkey(油猴) 插件,重新实现了,百度搜索热点过滤功能

    昨天晚上,花了点时间学习了Chrome插件的制作方法,并书写了<Chrome 百度搜索热点过滤插件 - 开源软件>这一文章,简单地介绍自己实现的百度搜索热点过滤神器的原理和使用方式,并进行 ...