题目:分割回文串
思路:对于每一个字符,都先判断其是否能够被分割,即以start为首,以当前字符为尾的字符串是否为回文串;如果能够分割(第一条路径),就将当前元素压入path,组成子回文串,并从下一个字符开始进行新一轮的回文串判断;第二条路径为:不从当前字符进行分割,而是直接转向下一个字符,从下一个字符开始判断(为了找到更长的回文串)
1bool isPalindrome(const string& s, int left, int right)
2{
3 while(left < right)
4 {
5 if(s[left++] != s[right--])
6 return false;
7 }
8 return true;
9}
10void dfs(string& s, int index, int start, vector<string>& path, vector<vector<string>>& res)
11{
12 const int sz = s.size();
13 if(index == sz)
14 {
15 res.emplace_back(path);
16 return;
17 }
18
19 if(isPalindrome(s, start, index))
20 {
21 path.emplace_back(s.substr(start, index - start + 1));
22 dfs(s, index + 1, index + 1, path, res);
23 path.pop_back();
24 }
25
26 if(index < sz - 1)
27 dfs(s, index + 1, start, path, res);
28}
29
30vector<vector<string>> partition(string s)
31{
32 vector<string> path;
33 vector<vector<string>> res;
34
35 dfs(s, 0, 0, path, res);
36 return res;
37}