目录
[93. 复原 IP 地址](#93. 复原 IP 地址)
[78. 子集](#78. 子集)
[90. 子集 II](#90. 子集 II)
93. 复原 IP 地址
cpp
class Solution {
vector<string>ans;
string path;
void dfs(string s,int start,int seg){
if(seg==4){
if(start==s.size()){
ans.push_back(path.substr(0,path.size()-1));
}
return ;
}
int need=4-seg;
int last=s.size()-start;
if(last<need||need*3<last)return ;
int val=0;
for(int len=1;len<=3;len++){
if(start+len>s.size())break;
if(len>1&&s[start]=='0')break;
if(len==1)val+=s[start]-'0';
else val=val*10+(s[start+len-1]-'0');
if(val>255)break;
int old=path.size();
path+=s.substr(start,len);
path+='.';
dfs(s,start+len,seg+1);
path.resize(old);
}
}
public:
vector<string> restoreIpAddresses(string s) {
dfs(s,0,0);
return ans;
}
};
78. 子集
法一:
cpp
class Solution {
vector<vector<int>> ans;
vector<int> path;
void dfs(vector<int>& nums, int start) {
ans.push_back(path);
for (int i = start; i < nums.size(); i++) {
path.push_back(nums[i]);
dfs(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
dfs(nums, 0);
return ans;
}
};
法二:
cpp
class Solution {
void dfs(int x, vector<vector<int>>& ans, vector<int>& path,
vector<int>& nums) {
if (x == nums.size()) {
ans.push_back(path);
return;
}
//选
path.push_back(nums[x]);
dfs(x + 1, ans, path, nums);
//不选
path.pop_back();
dfs(x + 1, ans, path, nums);
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> path;
dfs(0, ans, path, nums);
return ans;
}
};
90. 子集 II
cpp
class Solution {
vector<vector<int>>ans;
vector<int>path;
void dfs(vector<int>& nums,int start){
ans.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]);
dfs(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
dfs(nums,0);
return ans;
}
};
