考察知识点:回溯
题目分析:
可以使用回溯法找到所有的回文子串。就是把给定的字符串分割成一个一个的回文串,可以通过回溯的方法将字符串一段一段分隔,判断每一个子串是否是回文子串。如果是回文串则找包含下一个元素的回文子串,直到原字符串结尾。
首先将该串的第一个位置作为起始位置,不断地枚举结束位置。找到满足条件的结束位置后,就需要从下一个元素开始(下一个子串必须包含该元素),找剩下的区间中满足条件的回文串集合。下图中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;
}
};

京公网安备 11010502036488号