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"]
]
给定一个字符串,从中找出所有拆分后为回文串的组合。回文串是指正着读和反着读一样的字符串,这个地方我们可以写一个简单的判断函数即可。其实回想一下之前的Combination Sum,也是从数组中找出符合条件的元素,因此考虑回溯法来解决本题。对于已经找到的回文串,我们只需要关心其剩下的串是否还能组成回文串,且最终剩下的元素也是回文串,这样一来,我们借助一个条件判断函数和一个帮助函数,即可实现找出拆分的所有回文串组合。代码如下:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> ret;
vector<string> tmp;
backTrack(ret, tmp, s, 0);
return ret;
}
void backTrack(vector<vector<string>> &ret, vector<string> &tmp, string s, int idx)
{
if(idx == s.length())
{
ret.push_back(tmp);
return;
}
for(int i = idx; i < s.length(); i++)
{
if(isPalindrome(s.substr(idx, i - idx + 1)))
{
tmp.push_back(s.substr(idx, i - idx + 1));
backTrack(ret, tmp, s, i + 1);
tmp.pop_back();
}
}
}
bool isPalindrome(string s)
{
int first=0;
int end=s.size()-1;
while(first<end)
{
if(s[first++]!=s[end--])
return false;
}
return true;
}
};