Palindrome Partitioning

原题链接Palindrome Partitioning

对字符串进行切分,使得切分出的每个子串都是回文串,返回所有的切分可能

对于每个字符都可能在它的位置切分,所以可以容易想到使用深度优先和回溯法求解。另外,为了避免重复判断,采用动态规划的思想记录某个字符是否已经判断过

代码如下

class Solution {
public:vector<vector<string>> partition(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n, -1));vector<vector<string>> res;vector<string> cur;partition(s, 0, cur, res, dp);return res;}
private:/* 寻找s[idx : s.size()-1]这个字符串的切分结果 */void partition(string& s, int idx, vector<string>& cur, vector<vector<string>>& res, vector<vector<int>>& dp){if(idx >= s.size()){res.emplace_back(cur);return;}/* 将s[idx : s.size()-1]切分成s[idx : i]和s[i+1 : s.size()-1] */for(int i = idx; i < s.size(); ++i){if(dp[idx][i] == 0) continue;if(dp[idx][i] == 1 || isPalindrome(s, idx, i)){dp[idx][i] = 1;cur.emplace_back(s.substr(idx, i - idx + 1));partition(s, i + 1, cur, res, dp);cur.pop_back();}else{dp[idx][i] = 0;}}}bool isPalindrome(string& s, int start, int end){while(start < end){if(s[start++] != s[end--])return false;}return true;}
};

Palindrome Partitioning II

原题链接Palindrome Partitioning II

计算最少需要切分多少次才可以切分出每个都是回文串的情况

通常计算次数的问题都不会按照计算所有可能结果那样求解,所以本题也不会像上面的方法那样计算次数。不过切分的方法还是不变的,在每个可能的位置切分

对于源字符串s[i : n-1],对于i<=j<=n−1i的k,将其在j处切分得到s[i : j]和s[j+1 : n-1]。不过也不是对于所有的j都这样做,因为切分是需要满足回文规则的,需要s[i : j]是回文串

令count[i]表示s[i : n-1]这个子串最少需要切多少次才可以切成多个回文子串(n是字符串s的长度),那么有count[i]=min(count[i],1+count[j+1])count[i] = min(count[i], 1 + count[j + 1])

上式说明将字符串s[i : n-1]在j处切分,同时满足s[i : j]是回文串,那么总次数就是在k处切分的1次加上后半部分字符串的切分次数

代码如下

class Solution {
public:int minCut(string s) {if(s.empty())   return 0;int n = s.size();/* p[i][j]表示s[i : j]是否是回文串 */vector<vector<int>> p(n, vector<int>(n, 0));/* count[i]表示s[i : n-1]的最少切分次数 */vector<int> count(n, 0);for(int i = n - 1; i >= 0; --i){/* 没有计算之前,最小的次数就是全切分次数 */count[i] = n - 1 - i;/* 从后面每个位置都可以切分 */for(int j = i; j < n; ++j){/* 只有两边相等且中间是回文串时,加入s[j]后s[i : j]才是回文串 */if(s[i] == s[j] && (j - i <= 2 || p[i + 1][j - 1] == 1)){p[i][j] = 1;/* j == n -1代表s[i : n-1]是回文串,不需要切分 */if(j == n - 1)count[i] = 0;/* 更新最小次数 */else if(count[i] > 1 + count[j + 1])count[i] = 1 + count[j + 1];}}}return count[0];}
};

第一题主要利用回溯法,类似的求解所有可能的结果时采用回溯法是比较容易想到的。第二题的动态规划不太容易想到,如果考虑到子问题的话就好办了

每天一道LeetCode-----将字符串切分,使每个子串都是回文串,计算所有可能结果和最小切分次数相关推荐

  1. 分割字符串s使得每个子串都是回文串

    question: 给出一个字符串s,分割s使得分割出的每一个子串都是回文串 计算将字符串s分割成回文分割结果的最小切割数 例如:给定字符串s="aab", 返回1,因为回文分割结 ...

  2. 字符串:1.给定一个字符串s,分割s使得s的每一个子串都是回文串

    给定一个字符串s,分割s使得s的每一个子串都是回文串 返回所有的回文分割结果.(注意:返回结果的顺序需要和输入字符串中的字母顺序一致.) 例如:给定字符串s="aab", 返回 [ ...

  3. jquery 逗号分割截取字符串_经典面试题:分割回文串

    题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa",&qu ...

  4. leetcode 高薪_LeetCode 第 125 号问题:验证回文串

    本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 题目来源于 LeetCode 第 125 号问题:验证回文串. ...

  5. LeetCode 132. 分割回文串 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...

  6. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  7. LeetCode 131. 分割回文串【字符串,回溯算法】

    131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = &q ...

  8. LeetCode 131. 分割回文串(回溯)

    文章目录 1. 题目 2. 回溯 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: ...

  9. 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 第 131 号问题:分割回文串...

    题目来源于 LeetCode 上第 131 号问题:分割回文串.题目难度为 Medium,目前通过率为 45.8% . 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返 ...

最新文章

  1. ATS 5.3.0日志字段分析(续)
  2. 简单工厂 jdk源码解析
  3. html中超链接使用_HTML实例源码
  4. nyoj-673-悟空的难题(数组标记)
  5. python干货_Python干货整理,从入门说起(7.4)
  6. 【深度学习】生成对抗网络(GAN)的tensorflow实现
  7. 错误解决 “No module named ‘pytest‘“
  8. 【Tensorflow2.x】设置GPU(内存自增长、指定GPU)
  9. 怎么创建java项目?新建java项目的步骤
  10. 日常知识点之公开课内存碎片优化(内存池)
  11. 陀螺世界进度条一天进度多少_陀螺世界满级要多久?
  12. css将商品加入购物车,vue实现点击商品加入购物车动画
  13. vs不允许使用不完整的类型_擦痕破损严重老照片修复,基础工具辅助绘画,不使用素材完整修复...
  14. SQL之cast()函数用法
  15. lgx06:连接数据库的驱动和url
  16. Docker学习笔记(更新中)
  17. via ladder
  18. 史上最全国家统计局划分代码爬取
  19. 11g-sql plan management
  20. [瑞萨RH850学习笔记]——RDC与旋转变压器

热门文章

  1. Java黑皮书课后题第1章:1.13(代数:求解2*2线性方程组)编写程序,求解以下方程组并显示x和y的值 3.4x+50.2y=44.5 2.1x+0.55y=5.9
  2. C++中虚函数工作原理和(虚)继承类的内存占用大小计算
  3. Python的3种执行方式
  4. java8 java9 接口 interface
  5. 移动端rem适配-JS
  6. 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
  7. Android中的APinner2
  8. spring注解方式 idea报could not autowire
  9. 寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n
  10. 如何开展灰盒测试[1]:灰盒测试优缺点分析