一、93 复原IP地址

class Solution {
private:
vector<string>result;
void backtracking(string &s,int startindex,int pointsum){
if(pointsum == 3){
//添加逗点的数量为3
if(isValid(s,startindex,s.size()-1)){
result.push_back(s);
return;
}
}
for(int i=startindex;i<s.size();i++){
if(isValid(s,startindex,i)){
s.insert(s.begin()+i+1,'.');
pointsum += 1;
backtracking(s,i+2,pointsum);
s.erase(s.begin()+i+1);
pointsum -= 1;
}
}
}
bool isValid(const string &s,int begin,int end){//判断点前的字符串是否合法
if(begin>end)
return false;
if(s[begin]=='0'&&begin!=end)//0开头的
return false;
int num = 0;
for(int i=begin;i<=end;i++){
if(s[i]>'9'||s[i]<'0'){//非数字的
return false;
}
num = num*10+(s[i]-'0');
if(num>255){//如果大于255,不合法
return false;
}
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
if(s.size()<4||s.size()>12)//剪枝
return result;
backtracking(s,0,0);
return result;
}
};
二、78 子集

class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>& nums,int startindex){
result.push_back(path);
if(startindex>=nums.size())
return;
for(int i=startindex;i<nums.size();i++){
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
三、 90 子集II

class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>&nums,int startindex,vector<bool>&used){
result.push_back(path);
if(startindex >= nums.size())
return;
for(int i = startindex;i<nums.size();i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)
continue;
path.push_back(nums[i]);
used[i] = true;
backtracking(nums,i+1,used);
path.pop_back();
used[i] = false;
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool>used(nums.size(),false);
sort(nums.begin(),nums.end());//去重一定要排序
backtracking(nums,0,used);
return result;
}
};