【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II
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相关推荐
- 【回文串4 DFS】LeetCode 131. Palindrome Partitioning
LeetCode 131. Palindrome Partitioning DFS的经典套路题目!!! 八皇后问题写法类似!!! Solution1: 转载网址:http://www.cnblogs. ...
- 【leetcode】132. Palindrome Partitioning II
题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...
- leetcode题解131-分割回文串
问题描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = "aa ...
- LeetCode 1278. 分割回文串 III
截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...
- 【回文串问题】分割回文串
Leetcode:131. 分割回文串 - 力扣(LeetCode) (leetcode-cn.com) 分为两部分: 1.动态规划确定子串是否是回文串 2.枚举子集 时间复杂度:O(n*2^n) 空 ...
- 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring
LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...
- LeetCode 132. 分割回文串 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...
- 【动态规划 回文串11】LeetCode 516. Longest Palindromic Subsequence
LeetCode 516. Longest Palindromic Subsequence 本博客转载自:http://www.cnblogs.com/grandyang/p/6493182.html ...
- LeetCode之最大回文串--动态规划
1. 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1:输入: "babad"输出: "bab" 注意: ...
最新文章
- python调用shell命令-「Python」6种python中执行shell命令方法
- 使用 RequireJS 优化 Web 应用前端
- HDU - 5978 To begin or not to begin(简单博弈)
- C语言经典编程题--哥德巴赫猜想 、完数 、猜数字等
- HTML+CSS+JS实现 ❤️发光糖果泡泡动画特效❤️
- Linux下golang的编译,golang Linux下编译环境搭建
- BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换
- 制造业中人工智能的应用有哪些?
- hdu 4324 Triangle LOVE 拓扑排序 多校联合赛(三)第四题
- 3D点云语义分割认知随便写写(更新中)
- 【Django 2021年最新版教程11】数据库删除操作
- OpenSSL密码库算法笔记——第4章 模指数运算
- 像素级图像融合常用方法
- 2015年京胜杯删数!删数
- Java模拟微信发红包,一看就会
- require的用法 php,PHP 关于require()文件包含的用法详解
- 权力的游戏凛冬将至手游辅助升级脚本工具 新手操作指南
- DJ1 计算机系统概述
- ESXi 镜像添加驱动
- 考取华为HCIA证书需要什么流程,报培训班加考试费大概需要多少钱?
热门文章
- C++---之Arraylist
- Faied to run MSBuild commond CmakeError
- python 自动填excel_使用python自动填充文字.docx从excel fi
- hive内部表和外部表的区别_3000字揭秘Greenplum的外部数据加载——外部表
- react网页适配不同分辨率_PC端页面适应不同的分辨率的方法 (转载)
- qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动
- 计算机音频和视频知识点,计算机基础的知识点.docx
- Python数据结构与算法(2.2)——顺序表
- 异域linux内核漏洞,Linux内核再现漏洞!这次11年后才发现
- android 自定义字体_Android自定义字体教程