Given a strings, partitionssuch that every substring of the partition is a palindrome.
Return all possible palindrome partitioning ofs.
For example, givens="aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
典型的递归回溯法,当然可以利用动态规划法提高点效率。
下面是标准的递归回溯程序:
vector<vector<string> > partition(string s)
{
vector<vector<string> > rs;
vector<string> tmp;
storePatition(rs, tmp, s);
return rs;
}
void storePatition(vector<vector<string> > &rs, vector<string> &tmp,
string &s)
{
if (s.empty())
{
rs.push_back(tmp);
return;
}
for (int i = 1; i <= s.length(); i++)
{
string a = s.substr(0, i);
if (isPalindrome(a))
{
tmp.push_back(a);
string b = s.substr(i);
storePatition(rs, tmp, b);
tmp.pop_back();
}
}
}
bool isPalindrome(string &s)
{
for (int i = 0, j = s.length()-1; i < j; i++, j--)
{
if (s[i] != s[j]) return false;
}
return true;
}
//2014-2-18 update
vector<vector<string> > partition(string s)
{
vector<vector<bool> > table(s.length(), vector<bool>(s.length(), true));
genTable(table, s);
vector<vector<string> > rs;
vector<string> tmp;
part(rs, tmp, table, s);
return rs;
}
void part(vector<vector<string> > &rs, vector<string> &tmp,
vector<vector<bool> > &table, string &s, int start=0)
{
if (start == s.length())
{
rs.push_back(tmp);
return;
}
for (int d = 1; d <= s.length()-start; d++)
{
if (table[start][start+d-1])
{
tmp.push_back(s.substr(start, d));
part(rs, tmp, table, s, start+d);
tmp.pop_back();
}
}
}
void genTable(vector<vector<bool> > &table, string &s)
{
for (int d = 2; d <= s.length(); d++)
{
for (int i = 0, j = d - 1; j < s.length(); i++, j++)
{
table[i][j] = (table[i+1][j-1] && s[i] == s[j]);
}
}
}