代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集、90.子集II
93. 复原IP地址
题目链接:93. 复原 IP 地址 - 力扣(LeetCode)
这题好难,没做出来
class Solution {
public:
std::vector<std::string> arr;
bool isValid(const std::string &s,int be,int end){// 左闭右闭判断
if(be>end || (s[be] == '0'&&be !=end)) return 0;
int num = 0;
for(int i = be;i<=end;i++){
if(s[i] >'9' || s[i]<'0') return 0;
num *= 10;
num += s[i]-'0';
if(num>255) return 0;
}
return 1;
}
void backtracking( std::string &s,int index,int pointNum){
if(pointNum == 3){
if(isValid(s,index,s.size()-1)){
arr.push_back(s);
}
return;
}
for(int i = index;i<s.size();i++){
if(isValid(s,index,i)){
s.insert(s.begin()+1+i,'.');
pointNum++;
backtracking(s,i+2,pointNum);
pointNum--;
s.erase(s.begin()+1+i);// 删除插入的 .
}else break;
}
}
std::vector<std::string> restoreIpAddresses(std::string s) {
arr.clear();
if(s.size()>12 || s.size()<4) return arr;
backtracking(s,0,0);
return arr;
}
};
78. 子集
这个可以看作 纯选择问题
class Solution {
public:
std::vector<std::vector<int>> arr;
void backtracking(std::vector<int>& nums,std::vector<int> & ans,int index){
if(index>=nums.size()){
return;
}
for(int i = index;i<nums.size();i++){
ans.push_back(nums[i]);
arr.push_back(ans);
for(auto x:ans){
std::cout<<x<<' ';
}printf("\n");
backtracking(nums,ans,i+1);
ans.pop_back();
}
}
std::vector<std::vector<int>> subsets(std::vector<int>& nums) {
arr.push_back({});
if(nums.size()==0) return arr;
std::vector<int> ans;
backtracking(nums,ans,0);
return arr;
}
};
90. 子集II
class Solution {
public:
std::vector<std::vector<int>> result;
std::vector<int> path;
void backtracking(std::vector<int>& nums, int startIndex) {
result.push_back(path);
std::unordered_set<int> uset;
for (int i = startIndex; i < nums.size(); i++) {
if (uset.find(nums[i]) != uset.end()) {
continue;
}
uset.insert(nums[i]);
path.push_back(nums[i]);
backtracking(nums, i + 1);
path.pop_back();
}
}
std::vector<std::vector<int>> subsetsWithDup(std::vector<int>& nums) {
std::sort(nums.begin(), nums.end());
backtracking(nums, 0);
return result;
}
};