Palindrome Partitioning
来源:互联网 发布:java实现短信发送功能 编辑:程序博客网 时间:2024/05/22 08:08
方法一,DFS遍历,每次保证start参数之前的字串部分已经处理,[start, s.size()-1]部分待处理,针对该部分中的每一个位置i,如果[start,i]是一个palindrome串,则将子串[start,i]添加到path中,并进一步递归。时间O(2^n),空间O(n)。
class Solution {public: vector<vector<string>> partition(string s) { vector<vector<string> > result; vector<string> path; dfs(s, result, path, 0); return result; } void dfs(string &s, vector<vector<string> > &result, vector<string> &path, int start) { if(start == s.size()) { result.push_back(path); return; } for(int i=start; i<s.size(); ++i) { if(isPalindrome(s, start, i)) { path.push_back(s.substr(start, i-start+1)); dfs(s, result, path, i+1); path.pop_back(); } } } bool isPalindrome(string s, int start, int end) { while(start <= end && s[start] == s[end]) { start++; end--; } return start > end; }};
方法二: DP。 first compute whether each substring is palindrome using dp. then compute the partitioning result of each substring s[0,...i]
class Solution {public: vector<vector<string>> partition(string s) { const int n = s.size(); if(n == 0) return vector<vector<string> >(); vector<vector<bool> > f(n, vector<bool>(n, false)); for(int i=0; i<n; i++) f[i][i] = true; for(int L = 2; L<=n; L++) { for(int start=0; start <= n-L; start++) { int end = start+L-1; if(L == 2) f[start][end] = (s[start] == s[end]); else f[start][end] = (s[start] == s[end]) && f[start+1][end-1]; } } vector<vector<string> > result[n+1]; result[0] = {{}}; for(int i=0; i<n; i++) { for(int j=-1; j<i; j++) { if(f[j+1][i]) { for(auto vec: result[j+1]) { vec.push_back(s.substr(j+1, i-j)); result[i+1].push_back(vec); } } } } return result[n]; }};
0 0
- Palindrome partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- Palindrome Partitioning
- 事从容,则有余味;人从容,则有余年
- Linux代码阅读笔记----基本概念
- 雅虎网站页面性能优化的34条黄金守则
- C#笔记之隐式转换和显示转换
- phpcms学习总结
- Palindrome Partitioning
- 安装MATLAB_R2013b_X64_x32激活及破解方法
- Command(命令模式)
- 【黑马程序员】C#笔记之数据转换
- vim 用户手册中文版本
- 嵌入式开发WIFI方案选型经历
- Servlet 3.0 新特性之web模块化, web-fragment.xml文件
- 杭电acm之1106-排序
- 将一棵二叉树的全部节点的左右子树交换顺序