#include "iostream"
#include "vector"
using namespace std;
//问题描述:农场主人有一群牛,他给每只牛都取了一个名字,名字由小写字母组成。农场主人希望将这些牛分成一些组,
//每组的牛的名字合在一起都是回文串。回文串是正着读和反着读都一样的字符串。请你帮助农场主人找出所有可能的分组方案。每个分组方案按照字典序升序返回。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串vector<vector<>>
*/
// 判断是否为回文字符串
bool check(string str)
{
int left = 0;
int right = str.size()-1;
while(left<right)
{
if(str[left++]!=str[right--])
return false;
}
return true;
}
vector<string> v;
vector<vector<string>> ans;
// 深度优先搜索
void dfs(string& s, int start)
{
if(start>=s.size())
{
ans.emplace_back(v);
return;
}
for(int i=start; i<s.size(); ++i)
{
// 得到子串
string str = s.substr(start, i-start+1);
// 判断该子串是否为回文字符串
if(check(str))
{
v.emplace_back(str);
// 从子串的下一个位置开始递归
dfs(s,i+1);
// 回溯
v.pop_back();
}
}
}
vector<vector<string> > partition(string s) {
// write code here
dfs(s,0);
return ans;
}
};
// class Solution {
// public:
// //判断字符串str[s,e]区间的子串是否是回文串
// bool check(string& str,int s,int e)
// {
// for(int i=s,j=e;i<j;i++,j--)
// {
// if(str[i]!=str[j]) return false;
// }
// return true;
// }
// vector<vector<string> > ans;
// vector<string> path;
// void backtrack(string& s,int start)
// {
// if(start>=s.size())
// {
// ans.emplace_back(path);
// return ;
// }
// for(int i=start;i<s.size();i++)
// {
// //判断子串s[start,i]是否是回文串
// string sub=s.substr(start,i-start+1);
// //把以start为起点的所有回文子串找出来加进path中
// //是,就加入path中
// if(check(s,start,i)) path.emplace_back(sub);
// //不是回文串,就增加子串长度
// else continue;
// //递归,以start为起点的回文子串找完后就从新的起点开始找
// backtrack(s,i+1);
// //回溯
// path.pop_back();
// }
// }
// vector<vector<string> > partition(string s)
// {
// backtrack(s,0);
// return ans;
// }
// };