leetcode—Palindrome 解题报告
1.题目描述
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s =
"aab"
,
Return[
["aa","b"],
["a","a","b"]
]
也就是给定一个字符串,找出所有可能的划分,每一个划分的每一个字串都是回文串。设这个划分函数为partition_index(string s,int begin,int end)
2.解题思路
蛮力法当然是可以解决这个问题,对于一个长度为n的字符串,有2n-1种划分方法,只需要判断每种划分是否满足条件即可,虽然不知道暴力法能不能在系统里面ac掉,但是这样显然不是一个正常的程序员该干的事。不过蛮力法会给我们一些启示。我们从为什么蛮力法会有2n-1种划分方法开始分析。
当然,这也很容易分析,对于长度为n的字符串s0s1…sk…sn-1,在sk和sk-1之间我们可以选择截断与不截断,但是,我们可以基于这个思路理出一个递归的思路,那就是,对于字符串sbeginsbegin+1…sbegin+k…sn-1,所有可能满足条件的划分分为两类:
(1)在sbegin和sbegin+1之间有隔断,这种情况,只需sbegin和partition_index(s,begin+1,n-1)连接起来即可
(2)在sbegin和sbegin+1之间无隔断,这种情况,需找到至少包含sbegin和sbegin+1的一个回文字符串,如果能够找到,比如,sbegin…sbegin+k是一个回文字符串,那么,将这个回文字符串和partition_index(s,k+1,n-1)连接起来,注意,可能找到不止一个包含s0和s1的回文字符串,那么有多少个,就多出多少类划分可能;如果找不到,那么返回空vector.
3.代码
#include <iostream>#include <vector>#include <string>#include <iterator>using namespace std;vector<vector<string> > partition(string s);vector<vector<string> > partition_index(string s, int begin, int end);bool isPalindrome(string s, int begin,int end);int main(){partition("cdd");return 0;}vector<vector<string> > partition(string s) {return partition_index(s,0,s.length()-1);}vector<vector<string> > partition_index(string s, int begin, int end){vector<vector<string> > result;//边界条件if(begin == end){vector<string> item;item.push_back(s.substr(begin,1));result.push_back(item);return result;}if(begin > end) return result;//如果在begin与begin+1之间有划分vector<vector<string> > result_part1;result_part1 = partition_index(s,begin+1,end);if(!result_part1.empty()){vector<vector<string> >::iterator iter_vv;for(iter_vv = result_part1.begin();iter_vv!=result_part1.end();++iter_vv){vector<string> temp;//temp = *iter_vv;temp.push_back(s.substr(begin,1));vector<string>::iterator iter_v;for(iter_v = (*iter_vv).begin();iter_v!= (*iter_vv).end();++iter_v){temp.push_back(*iter_v);}result.push_back(temp);}}//如果在begin和begin+1之间无划分int nextSeg = begin +1;while(nextSeg<=end){//找到了回文字符串if(isPalindrome(s,begin,nextSeg)){vector<vector<string> >result_part2_1;result_part2_1 = partition_index(s,nextSeg+1,end);if(!result_part2_1.empty()){vector<vector<string> >::iterator iter_vv;for(iter_vv = result_part2_1.begin();iter_vv!=result_part2_1.end();++iter_vv){vector<string> temp;// temp = *iter_vv;temp.push_back(s.substr(begin,nextSeg));vector<string>::iterator iter_v;for(iter_v = (*iter_vv).begin();iter_v!= (*iter_vv).end();++iter_v){temp.push_back(*iter_v);}result.push_back(temp);}}else{vector<string>temp;temp.push_back(s.substr(begin,nextSeg-begin+2));result.push_back(temp);}}//继续找看是否有其他的更长的回文字符串nextSeg++;}return result;}//判断字符串由begin 和end 确定的字串是否为回文字符串bool isPalindrome(string s, int begin,int end){if(begin>end)return false;if(begin==end)return true;if((begin+1)==end)return s[begin]==s[end];elseif(s[begin]==s[end])return isPalindrome(s,begin+1,end-1);esle return false;}
另外,代码可以简化,比如,连接结果的代码可以封装成一个函数.
leetcode—Palindrome 解题报告的更多相关文章
- LeetCode: Permutations 解题报告
Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...
- 【LeetCode】409. Longest Palindrome 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:字典统计次数 方法二:HashSet 方法三 ...
- 【LeetCode】214. Shortest Palindrome 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 前缀是否回文 判断前缀 相似题目 参考资料 日期 题 ...
- 【LeetCode】125. Valid Palindrome 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 列表生成式 正则表达式 双指针 日期 题目地址:https:/ ...
- LeetCode: Valid Palindrome 解题报告
Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...
- LeetCode C++ 解题报告
自己做得LeetCode的题解,使用C++语言. 说明:大多数自己做得,部分参考别人的思路,仅供参考; GitHub地址:https://github.com/amazingyyc/The-Solut ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- LeetCode: Subsets 解题报告
Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...
- LeetCode: Triangle 解题报告
Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...
随机推荐
- 【win8技巧】去掉Win8导航菜单下面的这台电脑其他的文件夹
win8 删除 上传 下载 这台电脑 左侧导航 另存为中的 视频.图片.文档.下载的方法!落雨 win8 Windows 8.1 默认将视频.图片.文档.下载.音乐.桌面等常用文件夹也显示在其中了, ...
- IOS xib生成界面和代码生成界面两种方式混合
应用程序代理类 WKAppDelegate.m // // WKAppDelegate.m // HelloWorld // // Created by easy5 on 13-9-18. // Co ...
- 常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
http://www.cnblogs.com/cxd4321/archive/2013/01/30/2883078.html 目前市面上用的比较多的富文本编辑器有: FreeTextBox 一个有很多 ...
- 钣金的折弯成型工艺(Press Braking)
钣金的折弯成型:金属板材的弯曲和成型是在弯板机上进行的,将要成型的板材放置在弯板机上,用升降杠杆将制动片提起,工件滑动到适当的位置,然后将制动片降低到要成型的板材上,通过对弯板机上的弯曲杠杆施力而实现 ...
- CVE爬虫抓取漏洞URL
String url1="http://www.cnnvd.org.cn/vulnerability/index/vulcode2/tomcat/vulcode/tomcat/cnnvdid ...
- Java API ——StringBuffer类
1.StringBuffer类概述 1)我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.而StringBuffer就可以解决这个问题 2)线程安全的可变字 ...
- Web缓存杂谈--Etag & If-None-Match
一.概述 缓存通俗点,就是将已经得到的‘东东’存放在一个相对于自己而言,尽可能近的地方,以便下次需要时,不会再二笔地跑到起始点(很远的地方)去获取,而是就近解决,从而缩短时间和节约金钱(坐车要钱嘛). ...
- fd_set 用法
http://www.cnblogs.com/wolflion/archive/2011/07/13/2539137.html select()函数主要是建立在fd_set类型的基础上的.fd_set ...
- STM32硬件复位时间
两个参数,,1低电平时间 2低电平压值 1.stm32复位时间 ------ 低电平时间:1.5 至 4.5 ms 2.压值
- Windows CE,你妈吗喊你在多核上玩玩
转自:http://hezongjian.com/blog/?p=9693 众所周知,CE的内核是完全重新写的,与9x根nt没有任何关系,这给CE带来了较好的实时性及灵活性.从诞生之日起,CE的内核改 ...