描述
Palindrome Partitioning Feb 284465 / 15553
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"] ]
字符串能否划分成多个回文串?如果能,输出所有的划分方法。
分析
用递归来做,任意一个划分的方法,都是一个vector<string>,如果它非空,那么肯定存在他的第一个元素。对任意一个字符串s:
for i=1:s.length
s1=s[0~i]
s2=[i~end]
s1是回文串吗?如果不是,那就continue
如果是:
对s2进行递归,得到s2的输出,s2可能有多种划分方式,那么,在每一种的前面加上s1即可!
end
递归结束的条件是,输入的字符串长度为0(那么直接返回空的vector),或者输入的字符串的长度为1(返回仅包含该字母的veector)。
代码
class Solution {
public:
bool is_huiwen(const string &s)
{
int l=s.length();
int i;
for(i=0; i<l/2; i++)
if(s[i] != s[l-1-i])
return false;
return true;
}
vector<vector<string> > partition(string s)
{
int l=s.length();
// cout<<"l="<<l<<endl;
vector<vector<string> >vv;
vector<string> v;
if(l==0)
{
return vv;
}
int i;
for(i=1; i<l; i++)
{
string ts=s.substr(0,i);
// cout<<"i= "<<i<<" ts= "<<ts;
if(! is_huiwen(ts) )
continue;
string ts_end=s.substr(i,s.length() - i);
// cout<<"ts_end = "<<ts_end<<endl;
vector<vector<string> > vvt;
vvt=partition(ts_end);
int j;
for(j=0; j<vvt.size(); j++)
{
vvt[j].insert(vvt[j].begin(), ts);
// for(int m=0;m<vvt[j].size();m++)cout<<vvt[j][m]<<" ";cout<<endl;
vv.push_back(vvt[j]);
}
}
if(is_huiwen(s) )
{
v.push_back(s);
vv.push_back(v);
}
return vv;
}
};
Program Runtime: 12 milli secs
input | output | expected | |
---|---|---|---|
"a" | [["a"]] | [["a"]] |
|
"ab" | [["a","b"]] | [["a","b"]] |
|
"bb" | [["b","b"],["bb"]] | [["b","b"],["bb"]] |
|
"cdd" | [["c","d","d"],["c","dd"]] | [["c","d","d"],["c","dd"]] |
|
"dde" | [["d","d","e"],["dd","e"]] | [["d","d","e"],["dd","e"]] |
|
"efe" | [["e","f","e"],["efe"]] | [["e","f","e"],["efe"]] |
|
"fff" | [["f","f","f"],["f","ff"],["ff","f"],["fff"]] | [["f","f","f"],["f","ff"],["ff","f"],["fff"]] |
|
"abbab" | [["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]] | [["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]] |
|
"leet" | [["l","e","e","t"],["l","ee","t"]] | [["l","e","e","t"],["l","ee","t"]] |
|
"coder" | [["c","o","d","e","r"]] | [["c","o","d","e","r"]] |
|
Program Runtime: 368 milli secs
input | output | expected | |
---|---|---|---|
"a" | [["a"]] | [["a"]] |
|
"ab" | [["a","b"]] | [["a","b"]] |
|
"bb" | [["b","b"],["bb"]] | [["b","b"],["bb"]] |
|
"cdd" | [["c","d","d"],["c","dd"]] | [["c","d","d"],["c","dd"]] |
|
"dde" | [["d","d","e"],["dd","e"]] | [["d","d","e"],["dd","e"]] |
|
"efe" | [["e","f","e"],["efe"]] | [["e","f","e"],["efe"]] |
|
"fff" | [["f","f","f"],["f","ff"],["ff","f"],["fff"]] | [["f","f","f"],["f","ff"],["ff","f"],["fff"]] |
|
"abbab" | [["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]] | [["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]] |
|
"leet" | [["l","e","e","t"],["l","ee","t"]] | [["l","e","e","t"],["l","ee","t"]] |
|
"coder" | [["c","o","d","e","r"]] | [["c","o","d","e","r"]] |
|
"cbbbcc" | [["c","b","b","b","c","c"],["c","b","b","b","cc"],["c","b","bb","c","c"],["c","b","bb","cc"],["c","bb","b","c","c"],["c","bb","b","cc"],["c","bbb","c","c"],["c","bbb","cc"],["cbbbc","c"]] | [["c","b","b","b","c","c"],["c","b","b","b","cc"],["c","b","bb","c","c"],["c","b","bb","cc"],["c","bb","b","c","c"],["c","bb","b","cc"],["c","bbb","c","c"],["c","bbb","cc"],["cbbbc","c"]] |
|
"ccaacabacb" | [["c","c","a","a","c","a","b","a","c","b"],["c","c","a","a","c","aba","c","b"],["c","c","a","a","cabac","b"],["c","c","a","aca","b","a","c","b"],["c","c","aa","c","a","b","a","c","b"],["c","c","aa","c","aba","c","b"],["c","c","aa","cabac","b"],["c","caac","a","b","a","c","b"],["c","caac","aba","c","b"],["cc","a","a","c","a","b","a","c","b"],["cc","a","a","c","aba","c","b"],["cc","a","a","cabac","b"],["cc","a","aca","b","a","c","b"],["cc","aa","c","a","b","a","c","b"],["cc","aa","c","aba","c","b"],["cc","aa","cabac","b"]] | [["c","c","a","a","c","a","b","a","c","b"],["c","c","a","a","c","aba","c","b"],["c","c","a","a","cabac","b"],["c","c","a","aca","b","a","c","b"],["c","c","aa","c","a","b","a","c","b"],["c","c","aa","c","aba","c","b"],["c","c","aa","cabac","b"],["c","caac","a","b","a","c","b"],["c","caac","aba","c","b"],["cc","a","a","c","a","b","a","c","b"],["cc","a","a","c","aba","c","b"],["cc","a","a","cabac","b"],["cc","a","aca","b","a","c","b"],["cc","aa","c","a","b","a","c","b"],["cc","aa","c","aba","c","b"],["cc","aa","cabac","b"]] |
|
"racecar" | [["r","a","c","e","c","a","r"],["r","a","cec","a","r"],["r","aceca","r"],["racecar"]] | [["r","a","c","e","c","a","r"],["r","a","cec","a","r"],["r","aceca","r"],["racecar"]] |
|
"danaranad" | [["d","a","n","a","r","a","n","a","d"],["d","a","n","a","r","ana","d"],["d","a","n","ara","n","a","d"],["d","a","naran","a","d"],["d","ana","r","a","n","a","d"],["d","ana","r","ana","d"],["d","anarana","d"],["danaranad"]] | [["d","a","n","a","r","a","n","a","d"],["d","a","n","a","r","ana","d"],["d","a","n","ara","n","a","d"],["d","a","naran","a","d"],["d","ana","r","a","n","a","d"],["d","ana","r","ana","d"],["d","anarana","d"],["danaranad"]] |
|
| |||
| |||
| |||
| |||
| |||
自己写的测试代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<vector<string> > partition(string s) ;
int main()
{
string ss("ccaacabacb");
vector<vector<string> > vv = partition(ss);
int i,j;
for(i=0; i<vv.size(); i++)
{
for(j=0; j<vv[i].size(); j++)
{
cout<<vv[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
bool is_huiwen(const string &s)
{
int l=s.length();
int i;
for(i=0; i<l/2; i++)
if(s[i] != s[l-1-i])
return false;
return true;
}
vector<vector<string> > partition(string s)
{
int l=s.length();
// cout<<"l="<<l<<endl;
vector<vector<string> >vv;
vector<string> v;
if(l==0)
{
return vv;
}
int i;
for(i=1; i<l; i++)
{
string ts=s.substr(0,i);
// cout<<"i= "<<i<<" ts= "<<ts;
if(! is_huiwen(ts) )
continue;
string ts_end=s.substr(i,s.length() - i);
// cout<<"ts_end = "<<ts_end<<endl;
vector<vector<string> > vvt;
vvt=partition(ts_end);
int j;
for(j=0; j<vvt.size(); j++)
{
vvt[j].insert(vvt[j].begin(), ts);
// for(int m=0;m<vvt[j].size();m++)cout<<vvt[j][m]<<" ";cout<<endl;
vv.push_back(vvt[j]);
}
}
if(is_huiwen(s) )
{
v.push_back(s);
vv.push_back(v);
}
return vv;
}
运行:
chen@chen-book1:~$ ./cpp
c c a a c a b a c b
c c a a c aba c b
c c a a cabac b
c c a aca b a c b
c c aa c a b a c b
c c aa c aba c b
c c aa cabac b
c caac a b a c b
c caac aba c b
cc a a c a b a c b
cc a a c aba c b
cc a a cabac b
cc a aca b a c b
cc aa c a b a c b
cc aa c aba c b
cc aa cabac b