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]);
}
}
}
回文字符串分割算法
本文介绍了一种使用递归回溯法和动态规划法解决回文字符串分割问题的方法。通过两个示例程序展示了如何找到一个字符串的所有可能的回文子串分割方式。

被折叠的 条评论
为什么被折叠?



