class Solution {
public:
vector<string>result;
bool isValid(const string &s,int start,int end)
{
if(start>end)
return false;
if(s[start]=='0'&&start!=end)
return false;
int num=0;
for(int i=start;i<=end;i++)
{
if(s[i]<'0'||s[i]>'9')
return false;
num=num*10+(s[i]-'0');
if(num>255)
return false;
}
return true;
}
void backtarcing(string&s,int start,int pointNum)
{
if(pointNum==3)
{
if(isValid(s,start,s.size()-1))
{
result.push_back(s);
}
return;
}
for(int i=start;i<s.size();i++)
{
if(isValid(s,start,i))
{
s.insert(s.begin()+i+1,'.');
pointNum++;
backtarcing(s,i+2,pointNum);
pointNum--;
s.erase(s.begin()+i+1);
}
}
}
vector<string> restoreIpAddresses(string s) {
backtarcing(s,0,0);
return result;
}
};
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracing(const vector<int>&nums,int start)
{
result.push_back(path);
if(start>=nums.size())
return;
for(int i=start;i<nums.size();i++)
{
path.push_back(nums[i]);
backtracing(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backtracing(nums,0);
return result;
}
};
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracing(const vector<int>&nums,int start,vector<bool>& used)
{
result.push_back(path);
if(start>=nums.size())
return;
for(int i=start;i<nums.size();i++)
{
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false)
continue;
path.push_back(nums[i]);
used[i]=true;
backtracing(nums,i+1,used);
used[i]=false;
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool>used(nums.size(),false);
sort(nums.begin(),nums.end());
backtracing(nums,0,used);
return result;
}
};