LeetCode: Palindrome Partitioning [131]
2015-09-21 19:35
435 查看
【称号】
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"] ]
【题意】
给定一个字符串s, 要求对s进行划分,划分后每一个子串都是回文串。要求返回全部的划分情况
【思路】
直观思路是使用逐层递归。先确定第一个点。然后确定第二个点,再确定第三个点,依次类推。这样的方式的时间复杂度很高。本题使用DP:先计算出随意两个位置i,j之间的子串是否是回文串,用IsPalindrome[i][j]表示。
【代码】
class Solution { public: void getPartition(vector<vector<string> >&result, vector<string>&splits, int start, string&s, vector<vector<bool> >&isPal){ //spits-已切分的结果,start-当前切分開始的位置 if(start==s.length()){ vector<string> newSplits = splits; result.push_back(newSplits); return; } for(int end=start; end<s.length(); end++){ if(isPal[start][end]){ splits.push_back(s.substr(start, end-start+1)); getPartition(result, splits, end+1, s, isPal); splits.pop_back(); } } } vector<vector<string>> partition(string s) { vector<vector<string> >result; int len=s.length(); if(len==0)return result; vector<vector<bool> > isPal(len, vector<bool>(len, false)); //初始化isPal[i][i]=true; for(int i=0; i<len; i++) isPal[i][i]=true; //初始化相邻两位字符构成的子串 for(int i=0; i<len-1; i++) if(s[i]==s[i+1])isPal[i][i+1]=true; //推断其它i<j的位置 for(int i=len-3; i>=0; i--) for(int j=i+2; j<len; j++) isPal[i][j]=(s[i]==s[j]) && isPal[i+1][j-1]; //确定全部的组合 vector<string> splits; getPartition(result, splits, 0, s, isPal); return result; } };
相关文章推荐
- exit()和_exit()函数 http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html
- UVA 10118 Free Candies
- 程序员面试总结
- hdu5452 Minimum Cut 树链剖分 + 标记贡献
- 开发时遇到问题的解决思路
- Easeljs 小试
- Android Text Layout 框架
- MVC修改 (当前页面开启Dialog,不用Ifram)
- ocp-v13-612
- 对oracle中date/timestamp的操作
- stm32f407使用OV7725使用迭代阈值法进行图像二值化,图像分割
- jQuery实现图片懒加载
- 【链表项目1 - 建立单链表】
- 传球游戏
- SQLServer 2012 包含数据库(Contained Databases)
- 设计一个getMin功能的栈,如果面试官让你写一个数组类,一定不要用指针去管理new出来原生的数组,那就是在给自己挖坑
- 进程间通信方法
- 02-Block和typedef
- Spring JDBC 执行sql并下载执行sql的数据
- js数组的迭代器方法(some、every、forEach、map、filter)