LeetCode 132. Palindrome Partitioning II

Solution1:我的答案1
直接模仿131那道题的DFS解法,找其中size最小的。果不其然,因为超时只能部分AC。代码如下,仅供记录:

class Solution {
public:int minCut(string s) {vector<string> temp;vector<string> res;PalinDFS(s, 0, temp, res);return res.size() - 1;}void PalinDFS (string str, int start, vector<string> &temp, vector<string> &res) {if (start == str.size()) {if (res.size() == 0 || res.size() > temp.size())res = temp;return;} for (int i = start; i < str.size(); i++) {if (isPalin(str, start, i)) {temp.push_back(str.substr(start, i - start + 1));PalinDFS(str, i + 1, temp, res);temp.pop_back();}}}bool isPalin(string str, int begin, int end) { //[begin, end]是[闭,闭]区间int left = begin, right = end;while (left < right) {if (str[left] != str[right])return false;else {left++;right--;}}return true;}
};

Solution2:
参考网址:https://blog.csdn.net/jingsuwen1/article/details/51934277
解题思路:动态规划问题。
dp[i]表示子串[0, i]的最小回文切割,则最优解在dp[s.length-1]中。[0, i]的子串中包括了i+1个字符。
分几种情况:
1.初始化:当字串s[0:i] (包括i位置的字符)是回文串时,dp[i] = 0(表示不需要分割);否则,dp[i] = i(表示至多分割i次);
2.对于任意大于1的i,如果s[j:i]( 1 =< j <= i,即遍历i之前的每个子串)是回文时,dp[i] = min(dp[i], dp[j-1]+1);
(注:j不用取0是因为若j == 0,则又表示判断(0,i))。
相对容易理解的动态规划方法。

class Solution {public:int minCut(string s) {if (s.size() == 0) return 0;//dp[i]存放以i位置字符结尾的字符串的最小切割数,即所求为dp[s.size() - 1]int dp[s.size()];dp[0] = 0;//单个字符,无需切割for(int i = 0; i < s.size(); i++) {//dp[i]赋初值dp[i] = isPalin(s, 0, i)? 0 : i;//1 =< j <= i子串回文判定for (int j = i; j >= 1; j--) {if (isPalin(s, j, i))dp[i] = min(dp[i], dp[j-1] + 1);}}return dp[s.size() - 1];}bool isPalin(string &str, int begin, int end) {while (begin < end) {if (str[begin] != str[end])return false;else begin++;end--;}return true;}
};//20180718日更新,DP算法真厉害啊!
class Solution {public:int minCut(string s) {if (s.size() <= 1) return 0;int dp[s.size()];for (int i = 0; i < s.size(); i++) {dp[i] = isPalin(s, 0, i) == 1? 0:i;for (int j = 1; j <= i; j++) {if (isPalin(s, j, i)) {dp[i] = min(dp[i], dp[j-1] + 1);}}}return dp[s.size() - 1];}int isPalin(string& str, int begin, int end) {while (begin < end) {if (str[begin] != str[end])return 0;else {begin++;end--;}}return 1;}
};

Solution3:更优化的动态规划方法
参考网址:
http://www.cnblogs.com/grandyang/p/4271456.html
这道题是让找到把原字符串拆分成回文串的最小切割数,需要用动态规划Dynamic Programming来做,使用DP的核心是在于找出递推公式,之前有道地牢游戏Dungeon Game的题也是需要用DP来做,而那道题是二维DP来解,这道题由于只是拆分一个字符串,需要一个一维的递推公式,我们还是从后往前推,递推公式为:dp[i] = min(dp[i], 1+dp[j+1] ) i<=j

//在20180719搞懂了。。。
class Solution {
public:int minCut(string s) {int len = s.size();bool P[len][len];int dp[len + 1];for (int i = 0; i <= len; ++i) {//之所以要初始化dp[len] = -1//是为了当 j + 1 == len时计算用dp[i] = len - i - 1;}for (int i = 0; i < len; ++i) {for (int j = 0; j < len; ++j) {if (i == j) P[i][j] = true;elseP[i][j] = false;}}for (int i = len - 1; i >= 0; --i) {for (int j = i; j < len; ++j) {//更新p[i][j]时要用到i + 1和j - 1,故i要从大到小遍历,j要从小到大遍历if (s[i] == s[j] && (j - i <= 1 || P[i + 1][j - 1])) {P[i][j] = true;//dp[i]表示从s[i, s.size()-1]部分(闭闭区间)字符串的最小分割数dp[i] = min(dp[i], dp[j + 1] + 1);}}}return dp[0];}
};

【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II相关推荐

  1. 【回文串4 DFS】LeetCode 131. Palindrome Partitioning

    LeetCode 131. Palindrome Partitioning DFS的经典套路题目!!! 八皇后问题写法类似!!! Solution1: 转载网址:http://www.cnblogs. ...

  2. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  3. leetcode题解131-分割回文串

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

  4. LeetCode 1278. 分割回文串 III

    截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...

  5. 【回文串问题】分割回文串

    Leetcode:131. 分割回文串 - 力扣(LeetCode) (leetcode-cn.com) 分为两部分: 1.动态规划确定子串是否是回文串 2.枚举子集 时间复杂度:O(n*2^n) 空 ...

  6. 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring

    LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...

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

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

  8. 【动态规划 回文串11】LeetCode 516. Longest Palindromic Subsequence

    LeetCode 516. Longest Palindromic Subsequence 本博客转载自:http://www.cnblogs.com/grandyang/p/6493182.html ...

  9. LeetCode之最大回文串--动态规划

    1. 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1:输入: "babad"输出: "bab" 注意: ...

最新文章

  1. python调用shell命令-「Python」6种python中执行shell命令方法
  2. 使用 RequireJS 优化 Web 应用前端
  3. HDU - 5978 To begin or not to begin(简单博弈)
  4. C语言经典编程题--哥德巴赫猜想 、完数 、猜数字等
  5. HTML+CSS+JS实现 ❤️发光糖果泡泡动画特效❤️
  6. Linux下golang的编译,golang Linux下编译环境搭建
  7. BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换
  8. 制造业中人工智能的应用有哪些?
  9. hdu 4324 Triangle LOVE 拓扑排序 多校联合赛(三)第四题
  10. 3D点云语义分割认知随便写写(更新中)
  11. 【Django 2021年最新版教程11】数据库删除操作
  12. OpenSSL密码库算法笔记——第4章 模指数运算
  13. 像素级图像融合常用方法
  14. 2015年京胜杯删数!删数
  15. Java模拟微信发红包,一看就会
  16. require的用法 php,PHP 关于require()文件包含的用法详解
  17. 权力的游戏凛冬将至手游辅助升级脚本工具 新手操作指南
  18. DJ1 计算机系统概述
  19. ESXi 镜像添加驱动
  20. 考取华为HCIA证书需要什么流程,报培训班加考试费大概需要多少钱?

热门文章

  1. C++---之Arraylist
  2. Faied to run MSBuild commond CmakeError
  3. python 自动填excel_使用python自动填充文字.docx从excel fi
  4. hive内部表和外部表的区别_3000字揭秘Greenplum的外部数据加载——外部表
  5. react网页适配不同分辨率_PC端页面适应不同的分辨率的方法 (转载)
  6. qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动
  7. 计算机音频和视频知识点,计算机基础的知识点.docx
  8. Python数据结构与算法(2.2)——顺序表
  9. 异域linux内核漏洞,Linux内核再现漏洞!这次11年后才发现
  10. android 自定义字体_Android自定义字体教程