93.复原IP地址
class Solution {
public:
vector<string> res;
void backtracking(string& s, int start, int pointnum){
if(pointnum == 3){
//判断最后一段是否合法
if(isvalid(s, start, s.size()-1)){
res.push_back(s);
return;
}
}
for(int i=start; i<s.size(); i++){
if(isvalid(s, start, i)){
s.insert(s.begin() + i + 1, '.'); //参数是迭代器 在下标前插入
pointnum++;
backtracking(s, i+2, pointnum); //加了一个点 所以+2
pointnum--;
s.erase(s.begin() + i + 1); //参数是迭代器,删除下标所在元素
}
else break;
}
}
//区间左闭右闭
bool isvalid(const string& s, int begin, int end){
if(begin > end) return false;
if(s[begin] == '0' && begin != end) return false; //等于的是字符'0'
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) return false;
}
return true;
}
vector<string> restoreIpAddresses(string s) {
backtracking(s, 0, 0);
return res;
}
};
78.子集
子集问题是需要把每个节点都加进去
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& nums, int start){
res.push_back(path);
for(int i = start; i < nums.size(); i++){
path.push_back(nums[i]);
backtracking(nums, i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums, 0);
return res;
}
};
90.子集II
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& nums, int start){
res.push_back(path);
for(int i = start; i < nums.size(); i++){
if(i > start && nums[i] == nums[i-1]) continue; //对同一树层使用过的元素进行跳过
path.push_back(nums[i]);
backtracking(nums, i+1);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
backtracking(nums, 0);
return res;
}
};