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. 使用css的类名交集复合选择器 《转》

    复合选择器就是两个或多个基本选择器,通过不同方式连接而成的选择器,主要包括“交集”选择器.“并集”选择器.“后代”选择器. 交集选择器 “交集”复合选择器是由两个选择器直接连接构成,其结果是选中二者各 ...

  2. [PHP]算法- 二叉树的深度的PHP实现

    二叉树的深度: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 思路: 1.非递归层序遍历 2.使用辅助队列,根结点先入队列 ...

  3. java导出excel时合并同一列中相同内容的行

    一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...

  4. 了解java虚拟机—在TALB上分配对象(10)

    由于对象一般会分配在堆上,而堆是全局共享的.因此在同一时间,可能有多个线程在堆上申请空间.每次对象分内都必须要进行同步,因此TLAB这种线程专属的区域来避免多线程冲突.TLAB本身占用了eden区的空 ...

  5. C++中析构函数的作用

    如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭.析构函数允许类自动完成类似清理工作,不必调用其他成员函数. 析构函数也是特殊的类成员函数.简单来说,析构函数与构造函数的作用正好相反,它用来 ...

  6. MVC中的HtmlHelper详解

    熟悉MVC开发的朋友都应该知道在MVC中,每一个Controller都对应一个View,并且CS文件和对应的ASPX文件也被分离了,更重要的是不再有服务器端控件在工具箱中,不再是代码后至了.MVC中的 ...

  7. 纯css3实现的动画导航菜单

    测试咯 css3 前端特效代码 网页模板 图片素材 css3 前端特效代码 网页模板 图片素材 css3 前端特效代码 网页模板 图片素材 css3 前端特效代码 网页模板 图片素材 css3 前端特 ...

  8. 洛谷P3721 [AH2017/HNOI2017]单旋(线段树 set spaly)

    题意 题目链接 Sol 这题好毒瘤啊.. 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然 ...

  9. 【读书笔记】iOS-iCloud文件备份

    iOS应用在运行时经常要创建一些文件,不过这些文件要如何存放呢?有没有什么要求呢? 由于手机资源空间有限而且考虑到Apple推出的iCloud,我们确实要对创建出的文件按照作用的不同,分出几种类别出来 ...

  10. 怎样制作爽心的 dashboard ?

    在目前的大数据趋势中,数据的大屏可视化成为大家所推崇的一种互动展示模式.如果我们能够早一些了解和掌握这方面的技术,相信对我们的未来将会非常有帮助! 我们知道,通过报表工具实现大屏展示可以通过单张报表. ...