leetcode131.分割回文串
class Solution {
private:
vector<string> path;
vector<vector<string>> result;
void backtracking(int startIndex,string s){//1.确定函数的参数和返回值
//2.确定递归的终止条件,并添加结果
if(startIndex>=s.size()){
result.push_back(path);
return ;
}
//3.确定单层的循环逻辑
for(int i=startIndex;i<s.size();i++){
if(isPalindrome(s,startIndex,i)){//处理节点
path.push_back(s.substr(startIndex,i-startIndex+1));
}else{
continue;
}
backtracking(i+1,s);//递归
path.pop_back();//回溯
}
}
//判断是不是回文子串
bool isPalindrome(const string& s,int startIndex,int endIndex){
for(int i=startIndex,j=endIndex;i<j;i++,j--){
if (s[i]!=s[j]) return false;
}
return true;
}
public:
vector<vector<string>> partition(string s) {
backtracking(0,s);
return result;
}
};
注意点:
- 在回溯算法三部曲的第二步中记得收集结果集,本题的结果均是在叶子结点收集的。并且本题对result结果没有要求,要求在path收集的时候已经判断过了,这里只要判断startIndex是否到头了就行。
- 在回溯算法三部曲的第三步单层逻辑中,调用isPalindrom判断是否是回文串,
如果一旦有一个不是回文串了记得continue继续留在本层向后遍历
,就不要到递归到下一层去了,因为题目要求的是所有子串均为回文子串,否则会有RunTimeError vector容器会爆内存(vector会不断扩容),并且这也不符合题意不是么。 path.push_back(s.substr(startIndex,i-startIndex+1));
c++ substr方法定义是 截取startIndex包括start以后的多少个字符,明显从s[startIndex]到s[i]有i-startIndex+1个字符;