题目描述
原题链接:131. 分割回文串
解题思路
本题为分割问题,分割问题类似于组合问题。组合问题是按某一顺序进行遍历,依次选取数组中的元素。而分割问题是按某一顺序进行切割,切割出一个数后,继续递归向下以相同的方式进行切割。不论是切割还是组合,本质上都是选择一个数,然后对于选择的数进行某种判断,判定是否加入结果当中,再继续向下遍历。回退时候,将加入的数弹出。
回文串的特点是对称性,例如abba
、abcdcba
就是会问串。题中的目标就是将一整个字符串,切割出各个子串,保证子串回文串。因此,就需要从头到尾依次遍历,确定符合条件的所有切割点组合。
例如,aab
。切割方案有:"a"、"a"、"b”
和"aa"、"b"
。
class Solution {
public:
vector<string> path;
vector<vector<string>> res;
// 判定是否为回文串(关于中心数字对称)
bool isPalindrome(string s, int start, int end) {
// 左右双指针法,判定是否对称
for(int i = start, j = end; i < j ; i++, j--) {
if(s[i] != s[j]) return false;
}
return true;
}
// 回溯法
void backtracking(string s, int startIndex) {
// 当遍历完全部时
if(startIndex == s.size()) {
res.push_back(path);
return ;
}
// 遍历各种情况
for(int i = startIndex; i <= s.size(); i++) {
// 判断是否为会问串,若是则切割子串,不是则跳过该情况
if(isPalindrome(s, startIndex, i)) {
string str = s.substr(startIndex, i - startIndex + 1);
path.push_back(str);
backtracking(s, i + 1); // 更新起始点,向右侧子串进行切割
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s, 0);
return res;
}
};
参考文章:#131.分割回文串