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<string> tmp;
vector<vector<string> > pars(s.size(), tmp);
for(int i = 0; i < s.size(); i++)
{
for(int j = i; j < s.size(); j++)
{
string sub = s.substr(i, j - i + 1);
if(isPar(sub))
{
pars[i + sub.size() - 1].push_back(sub);
}
}
}
if(!pars[s.size() - 1].empty())
buildResult(pars, s.size() - 1, tmp);
return result;
}
private:
bool isPar(string s)
{
int start = 0;
int end = s.size() - 1;
while(start <= end)
{
if(s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
void buildResult(vector<vector<string> > pars, int index, vector<string> &cur)
{
if(index < 0)
{
vector<string> tmp;
for(int i = cur.size() - 1; i >= 0; i--)
{
tmp.push_back(cur[i]);
}
result.push_back(tmp);
return;
}
for(int i = 0; i < pars[index].size(); i++)
{
cur.push_back(pars[index][i]);
buildResult(pars, index - pars[index][i].size(), cur);
cur.pop_back();
}
}
vector<vector<string> > result;
};
Round 2:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> temp;
findPal(0, s, temp);
return result;
}
private:
vector<vector<string> > result;
void findPal(int start, const string &s, vector<string> &cur)
{
if(start == s.size())
result.push_back(cur);
for(int i = start; i < s.size(); i++)
{
if(isPal(start, i, s))
{
cur.push_back(s.substr(start, i-start+1));
findPal(i+1, s, cur);
cur.pop_back();
}
}
}
bool isPal(int l, int r, const string &s)
{
if(m_pal[l][r] == -1)
{
while(l < r)
{
if(s[l] != s[r])
{
return false;
}
l++;
r--;
}
return true;
}
}
};