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”]
]
class Solution {
public:
vector<vector<string> > partition(string s)
{
vector<vector<string> > res;
map<string, bool> flag;
vector<string> tmp;
if (s.size() == 0)
return res;
part(s,flag, res, tmp);
return res;
}
void part(string s, map<string, bool> &flag, vector<vector<string> > &res, vector<string> &tmp)
{
for(int i=0;i<s.size();i++)
{
string strtmp = s.substr(0,i+1);
if (ifpalindrome(strtmp, flag))
{
tmp.push_back(strtmp);
if (i == s.size()-1)
res.push_back(tmp);
else
part(s.substr(i+1),flag, res, tmp);
tmp.pop_back();
}
}
}
bool ifpalindrome (string str, map<string, bool> &flag)
{
if (flag.find(str) != flag.end())
return flag[str];
for(int i=0,j=str.size()-1;i<j;i++,j--)
{
if (str[i] != str[j])
{
flag.insert(pair<string, bool>(str, false));
return false;
}
}
flag.insert(pair<string, bool>(str, true));
return true;
}
};
测试
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
vector<vector<string> > partition(string s)
{
vector<vector<string> > res;
map<string, bool> flag;
vector<string> tmp;
if (s.size() == 0)
return res;
part(s,flag, res, tmp);
return res;
}
void part(string s, map<string, bool> &flag, vector<vector<string> > &res, vector<string> &tmp)
{
for(int i=0;i<s.size();i++)
{
string strtmp = s.substr(0,i+1);
if (ifpalindrome(strtmp, flag))
{
tmp.push_back(strtmp);
if (i == s.size()-1)
res.push_back(tmp);
else
part(s.substr(i+1),flag, res, tmp);
tmp.pop_back();
}
}
}
bool ifpalindrome (string str, map<string, bool> &flag)
{
if (flag.find(str) != flag.end())
return flag[str];
for(int i=0,j=str.size()-1;i<j;i++,j--)
{
if (str[i] != str[j])
{
flag.insert(pair<string, bool>(str, false));
return false;
}
}
flag.insert(pair<string, bool>(str, true));
return true;
}
};
int main()
{
Solution s;
vector<vector<string > > res = s.partition("aabab");
for (int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].size();j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
}