代码随想录刷题03.09(2)
回溯算法4
LeetCode题目
解题思路
1.字符串切割问题关键:用left,right将字符串截取出来,进行判断或其他相关操作;
2.index含义:表示每一层的起始位置;
3.利用N叉树图来理解回溯中的for循环和递归,N叉树的每一层都是一个for循环,每一枝都是一个递归,回溯始于递归相对应的,递归向下传递,回溯时向上返回过程中对特定参数的保持。
代码过程
class Solution {
public:
vector<string>result;
int pointnum=0;
bool judge(const string& ss,int left,int right){
if(left>right)return false;
if(ss[left]=='0'&&right!=left)return false;
long int num=0;
for(int i=left;i<=right;i++)
{
if(ss[i]>'9'||ss[i]<'0')return false;
num=num*10+(ss[i]-'0');
if(num>255)return false;
}
return true;
}
void backtracking(string& s,int index){
if(pointnum==3){
if(judge(s,index,s.size()-1)){
result.push_back(s);
return;
}
return;
}
for(int i=index;i<s.size();i++)
{
if(judge(s,index,i)){
s.insert(s.begin()+i+1,'.');
pointnum++;
backtracking(s,i+2);
pointnum--;
s.erase(s.begin()+i+1);
}else break;
}
return;
}
vector<string> restoreIpAddresses(string s) {
int index=0;
backtracking(s,index);
return result;
}
};
LeetCode题目
解题思路
1.子集问题的关键:在每个节点上都要进行结果收获;
2.回溯分析三关键:N叉树图,终止,搜索体;最后还要根据代码熟悉数据流向!
3.注意:二维vector容器的空集初始化:vector<vector>result={{}};
代码过程
class Solution {
public:
vector<int>path;
vector<vector<int>>result={{}};
void backtracking(vector<int>&nums,int index){
if(index==nums.size()){
return;
}
for(int i=index;i<nums.size();i++)
{
path.push_back(nums[i]);
result.push_back(path);
backtracking(nums,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
int index=0;
backtracking(nums,index);
return result;
}
};
LeetCode题目
解题思路
本体思路:去重操作+子集问题:
1)去重操作:树层去重【数组重排序+前后两个数不等】+避免树枝去重【使用used数组标记每个元素的使用情况】;
2)子集问题:对每个节点进行结果收获。
代码过程
class Solution {
public:
vector<int>path;
vector<vector<int>>result;
vector<bool>used;
void backtracking(vector<int>& nums,int index){
result.push_back(path);
if(index==nums.size())return;
for(int i=index;i<nums.size();i++)
{
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)continue;
else{
used.push_back(true);
path.push_back(nums[i]);
used[i]=true;
backtracking(nums,i+1);
path.pop_back();
used[i]=false;
}
}
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(nums,0);
return result;
}
};