93. 复原 IP 地址
class Solution {
private:
vector<string>result;
void baktracking(string &s,int index,int N)
{
if(N==3)
{
if(judge(s,index,s.size()-1))
{
result.push_back(s);
}
return;
}
for(int i=index;i<s.size();i++)
{
if(judge(s,index,i) )
{
N++;
s.insert(s.begin()+i+1,'.');
baktracking(s,i+1+1,N);
s.erase(s.begin()+i+1);
N--;
}
else return;
}
}
bool judge(string &s,int start,int end)
{
if(start>end) return false;
if(s[start]=='0' && start!=end) return false;
long long sum=0;
for(int i=start;i<=end;i++)
{
if(s[i]>'9'||s[i]<'0') return false;
sum = sum*10+ (s[i]-'0');
if(sum>255) return false;
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
if(s.size()>12 || s.size()<4) return result;
baktracking(s,0,0);
return result;
}
};
78. 子集(相比上题思路清楚,好理解!)
class Solution {
private:
vector<vector<int>>result;
vector <int> temp;
void backtracking(vector<int> &nums,int index)
{
result.push_back(temp);
if(index==nums.size())
return;
for(int i=index;i<nums.size();i++)
{
temp.push_back(nums[i]);
backtracking(nums,i+1);
temp.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>temp;
void backtarcking(vector<int>nums, int index,vector<int>used)
{
result.push_back(temp);
if(index == nums.size())
{
return;
}
for(int i=index;i<nums.size();i++)
{
if (i>0 && used[i-1]==false && nums[i-1]==nums[i] )
continue;
used[i]=true;
temp.push_back(nums[i]);
backtarcking(nums,i+1,used);
used[i]=false;
temp.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<int>used(nums.size(),0);
sort(nums.begin(),nums.end());
backtarcking(nums,0,used);
return result;
}
};