题目描述
给定一个字符串s,分割s使得s的每一个子串都是回文串
返回所有的回文分割结果。(注意:返回结果的顺序需要和输入字符串中的字母顺序一致。)
例如:给定字符串s="aab",
返回
[↵ ["aa","b"],↵ ["a","a","b"]↵ ]
思路:
对于s 依次分析第一个可以分割出的回文子串
剩余的子串递归分析下去,直到结束,完成一次结果搜索
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> cur_res;
vector<vector<string>> res;
if(s=="")
return res;
dfs(s,cur_res,res);
return res;
}
bool Can(string s)
{
return s==string(s.rbegin(),s.rend());//判断是否为回文串
}
void dfs(string s,vector<string>& cur_res,vector<vector<string>>& res)
{
if(s=="") //说明已经深度搜索完一次s
{
res.push_back(cur_res);// 那么在cur_res中的分割字符串组合 是一个解
}
for(int i=1;i<=s.size();i++) //开始分析s第一个可以分割出的回文串
{
string sub_str=s.substr(0,i);//截取下来
string str=s.substr(i,s.size());
if(Can(sub_str)) //是回文串 那么剩下的字符串为一个子问题
{
cur_res.push_back(sub_str);//将一个回文子串 压入一个回答序列中
dfs(str,cur_res,res);
cur_res.pop_back();//递归搜索返回后 弹出sub_str 确保循环入口的cur_res一致
}
}
}
};