这也是用回溯解决,回溯就是多层for循环,但是这一题有点难发现多层for循环体现在哪里。
实际上该问题for循环的层数与字符串的间隔有关
for循环的层数代表,分割线的个数;for循环的遍历代表这分割线的位置。
这里引用卡哥的图:
因为分割线不能取前一个的位置,所以要根据之前组合那题的套路,要引用startflag这个参数。
整体上还是脱离不了卡哥讲的那个框架。
点击查看代码
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
完整代码:
点击查看代码
class Solution {
public:
vector<string>v;
vector<vector<string>>cnt;
string temp;
bool huiwen(string s,int left,int right){
while(left<=right){
if(s[left]!=s[right]){return false;}
++left;
--right;
}
return true;
}
void backtracking(string s,int startflag){
if(startflag>=s.size()){
cnt.push_back(v);
return ;
}
for(int i=startflag;i<s.size();i++){
if(huiwen(s,startflag,i)){
string str=s.substr(startflag,i-startflag+1);
v.push_back(str);
}
else{continue;}
backtracking(s,i+1);
v.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return cnt;
}
};