思路:
使用深度搜索(DFS)遍历所有的子串,判断每一个子串是否为回文字符串
class Solution {
public:
vector<vector<string> > partition(string s) {
vector<vector<string> > res;
vector<string> resTmp;
partitionDFS(s, 0, resTmp, res);
return res;
}
void partitionDFS(string s, int start, vector<string> &resTmp, vector<vector<string> > &res)
{
/*结束条件*/
if (start == s.size())
{
res.push_back(resTmp);
return;
}
for (int i = start; i < s.size(); i++)
{
/*如果是回文串*/
if (isPartition(s, start, i)) //如果第一个子串是回文才往后面递归
{
resTmp.push_back(s.substr(start, i-start+1)); //放入字符串数组中
partitionDFS(s, i+1, resTmp, res);
resTmp.pop_back(); //从字符串数组中取出来,因为下次从头开始还用这个变量来存下一批回文子串
}
}
}
/*判断是否为回文串*/
bool isPartition(string s, int start, int end)
{
while (start < end)
{
if (s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
};
固定第一个子串,如果第一个子串是回文,后面的子串用递归进行判断是否是回文,
先循环找第一个子串,可能是前1个、前两个。。。前n个,固定第一个子串了,进行判断,
如果是回文,递归继续求第一个子串固定了的后面的子串,递归完毕将第一个子串从字符串数组中弹出,
递归结束的条件就是,判断到最后一个子串都是回文了,把字符串数组放到要返回的结果数组中。