题解:
回溯三部曲:
1、确定回溯函数参数
void backtracking(const string& s,int startIndex)
2、确定递归函数终止条件
起始位置startIndex已经大于s.size(),说明已经找到了一组分割方案,返回
3、确定单层搜索逻辑
判断截取的子串是不是回文,是则加入结果集,不是则跳过,回溯搜索以i+1为起始位置的子串
如下(代码随想录讲解图),便于理解:
class Solution {
public:
vector<vector<string>> result;
vector<string> path;
//回溯函数
void backtracking(const string& s,int startIndex){
//起始位置已经大于s,说明已经找到了一组分割方案
if(startIndex>=s.size()){
result.push_back(path);
return;
}
for(int i = startIndex;i<s.size();i++){
if(isPalindrome(s,startIndex,i)){
//是回文子串 获取[startIndex,i]在s中的子串
string str = s.substr(startIndex,i-startIndex+1);
path.push_back(str);
}else{
//不是回文 跳过
continue;
}
//寻找i+1为起始位置的子串
backtracking(s,i+1);
path.pop_back();
}
}
//判断回文
bool isPalindrome(const 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;
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return result;
}
};