93.复原IP地址
class Solution {
public:
vector<string> res;
bool isValid(string&s,int startIndex,int endIndex){
if(startIndex>endIndex) return false;
if(s[startIndex]=='0'&&startIndex!=endIndex) return false;
int sum=0;
for(int i=startIndex;i<=endIndex;i++){
if(s[i]<'0'&&s[i]>'9')return false;
sum=sum*10+(s[i]-'0');
if(sum>255||sum<0) return false;
}
return true;
}
void backTracking(string &s,int index,int pointNum){
if(pointNum==3){
if(isValid(s,index,s.size()-1)){
res.push_back(s);
}
return;
}
for(int i=index;i<s.size();i++){
if(isValid(s,index,i)){
s.insert(s.begin()+i+1,'.');
pointNum++;
backTracking(s,i+2,pointNum);
pointNum--;
s.erase(s.begin()+i+1);
}
else continue;
}
}
vector<string> restoreIpAddresses(string s) {
if(s.size()<=0||s.size()>12) return res;
backTracking(s,0,0);
return res;
}
};
78. 子集
C++:
class Solution {
public:
vector<vector<int>> res;
vector<int> temp;
void backTracking(vector<int>&nums,int index){
if(index==nums.size()+1) return;
res.push_back(temp);
for(int i=index;i<nums.size();i++){
temp.push_back(nums[i]);
backTracking(nums,i+1);
temp.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
if(nums.size()==0) return res;
backTracking(nums,0);
return res;
}
};
90.子集II
C++:used[i-1]==false同层
class Solution {
public:
vector<vector<int>> res;
vector<int> temp;
void backTracking(vector<int>&nums,int index,vector<bool>&used){
res.push_back(temp);
if(temp.size()>=nums.size()) return;
for(int i=index;i<nums.size();i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;
used[i]=true;
temp.push_back(nums[i]);
backTracking(nums,i+1,used);
temp.pop_back();
used[i]=false;
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool> used(nums.size(),false);
backTracking(nums,0,used);
return res;
}
};
C++:unordered_set<int>
class Solution {
public:
vector<vector<int>> res;
vector<int> temp;
void backTracking(vector<int>&nums,int index/*,vector<bool>&used*/){
res.push_back(temp);
if(temp.size()>=nums.size()) return;
unordered_set<int> used;
for(int i=index;i<nums.size();i++){
//if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;
//used[i]=true;
if(used.count(nums[i])) continue;
used.insert(nums[i]);
temp.push_back(nums[i]);
backTracking(nums,i+1/*,used*/);
temp.pop_back();
//used[i]=false;
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
//vector<bool> used(nums.size(),false);
//backTracking(nums,0,used);
backTracking(nums,0);
return res;
}
};