题目部分
93.复原IP地址
valid函数是自己写的
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
result.clear();
tracbacking(s,0,0);
return result;
}
void tracbacking(string s,int startIndex,int pointSum){
if(pointSum==3){
if(isvalid(s,startIndex,s.size()-1)){
result.push_back(s);
}
return;
}
for(int i =startIndex;i<s.size();i++){
if(isvalid(s,startIndex,i)){
pointSum++;
s.insert(s.begin()+i+1,'.');
tracbacking(s,i+2,pointSum);
s.erase(s.begin()+i+1);
pointSum--;
}else break;
}
}
private:
vector<string> result;
bool isvalid(string s, int startIndex, int endIndex) {
if (endIndex - startIndex > 3)return false;
if (startIndex > endIndex)return false;
string str = s.substr(startIndex, endIndex-startIndex + 1);
if (str[0] == '0' && startIndex != endIndex)return false;
int num = stoi(str);
if (num > 255 || num < 0)return false;
return true;
}
};
78.子集
注意收割结果和终止条件的顺序不能反,不然叶子结点没法收割,因为收割放在了下面一层
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
result.clear();
path.clear();
tracebacking(nums,0);
return result;
}
private:
vector<vector<int>> result;
vector<int> path;
void tracebacking(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]);
tracebacking(nums,i+1);
path.pop_back();
}
}
};
90.子集2
没有什么新内容,但是自己写的used数组的false和true搞反了,而且continue也写成了break,不够熟悉
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool> used(nums.size(),false);
tracebacking(nums,0,used);
return result;
}
private:
vector<vector<int>> result;
vector<int> path;
void tracebacking(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]==nums[i-1]&&used[i-1]==false)continue;
used[i]=true;
path.push_back(nums[i]);
tracebacking(nums,i+1,used);
path.pop_back();
used[i]=false;
}
}
};