考察知识点:回溯
题目分析:
可以使用回溯法找到所有的回文子串。就是把给定的字符串分割成一个一个的回文串,可以通过回溯的方法将字符串一段一段分隔,判断每一个子串是否是回文子串。如果是回文串则找包含下一个元素的回文子串,直到原字符串结尾。
首先将该串的第一个位置作为起始位置,不断地枚举结束位置。找到满足条件的结束位置后,就需要从下一个元素开始(下一个子串必须包含该元素),找剩下的区间中满足条件的回文串集合。下图中group的目的是找满足条件的每一种情况,将每种情况加入到结果集中就得到了题目的解。
每次遇到分出来的字符串不是回文串的情况时,就不必再向下走了。
所用编程语言:C++
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串vector<vector<>> */ bool isPalindrome(string &s, int start, int end) { int left = start, right = end; while (left < right) { if (s[left++] != s[right--]) return false; } return true; } void backtrack(string &s, int start, vector<string> &group, vector<vector<string>> &groups) { if (start == s.size()) { groups.push_back(group); return; } for (int i = start; i < s.size(); i++) { if (isPalindrome(s, start, i)) { group.push_back(s.substr(start, i - start + 1)); backtrack(s, i + 1, group, groups); group.pop_back(); } } } vector<vector<string> > partition(string s) { // write code here vector<vector<string>> groups; vector<string> group; backtrack(s, 0, group, groups); return groups; } };