class Solution{
public:
void fun(string s,vector<string> &v, vector<vector<string>>&ans) //把其中一个字符串分成两段 看可不可以
{
if (s.size() == 1)
{
v.push_back(s);
ans.push_back(v);
v.pop_back();
}
else
{
for (int i = 0; i < s.size(); i++)
{
string s1 = s.substr(0, i+1);//从下标0开始 后面i+1个
if (palindrome(s1))
{
v.push_back(s1);
if (i != (s.size() - 1)) //如果没有划分到最后
{
string s2 = s.substr(i + 1);
fun(s2, v, ans);
}
else //防止“bb”这种 ,否则会出现“b”"b"但没有“bb”
{
ans.push_back(v);
}
v.pop_back();//回溯
}
}
}
}
bool palindrome(string s)
{
for (int i = 0; i < s.size(); i++)
{
if (s[i] != s[s.size() - i - 1])
{
return false;
}
}
return true;
}
vector<vector<string>> partition(string s)
{
vector<vector<string>> ans;
vector<string> v;
if (s.empty())return ans;
fun(s, v, ans);
return ans;
}
};
解法:字符串分割,分成回文的,标准的回溯法,分成两部分,一点点去判断。
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab" Output: [ ["aa","b"], ["a","a","b"] ]