题解:
回溯三部曲:
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; } };