93.复原IP地址
class Solution {
public:
vector<string> result;
string path;
void backtrack(string s,int startindex,int point)
{
if(point == 3)
{
if(isvalid(s,startindex,s.size()-1))
{
result.push_back(s);
}
return;
}
for(int i=startindex; i<s.length();i++)
{
if(isvalid(s,startindex,i))
{
s.insert(s.begin()+i+1,'.');
point++;
backtrack(s,i+2,point);
point--;
s.erase(s.begin()+i+1);
}
else{
break;
}
}
}
// 判断字符串s在左闭右闭区间[start, end]所组成的数字是否合法
bool isvalid(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]>'9' || s[i]<'0')
{
return false;
}
num = num*10 +s[i]-'0';
}
if(num>255)
{
return false;
}
return true;
}
vector<string> restoreIpAddresses(string s) {
if(s.length()<4 || s.length()>12)
{
return result;
}
backtrack(s,0,0);
return result;
}
};
78.子集
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void track(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]);
track(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
track(nums,0);
return result;
}
};
90.子集II
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void track(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-1] ==nums[i]&&used[i-1]==false)
{
continue;
}
used[i] =true;
path.push_back(nums[i]);
track(nums,i+1, used );
path.pop_back();
used[i] =false;
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool> used (nums.size(),false);
track(nums,0,used);
return result;
}
};