93.复原IP地址
思想:常规回溯模板,这次插入的元素是长度为1-3的字符串,而且第一位必须从输入字符串的第一个开始,所以针对每个分出来的字符串要做合理性判断,如果满足条件,则push进path,path中字符串个数为4并且已访问完最后一个元素时则push进result。
class Solution {
public:
vector<string> result;
string path;
int counter_path = 0;
int index = 0;
string temp;
bool judge(string temp){
if (temp.size() > 1 && temp[0] == '0') return false;
if(temp.size() > 3) return false;
int num = stoi(temp);
return num >= 0 && num <= 255;
}
// 四段字符串返回一次
void visit(string s, int index) {
// 难点:怎么处理0 两种情况:一种是当前字符串大小大于1且第一位是0
// 另一种是 当前字符串大小等于1 且这一位是0
// 除此之外,大小不在0-255之间的 去掉
// for循环中循环次数的选择,每段不可以大于3位 所以计数到3就停止
if (counter_path == 4&&index==s.size()) {
// 插入字符串时要把当前字符串中末尾的‘.’给去掉,这里是求了一个子串
result.push_back(path.substr(0, path.size() - 1));
return;
}
if (counter_path == 4 || index == s.size()) {
return;
}
// 从哪个位置开始截
for (int len = 1; len < 4; len++) {
if(index+len>s.size())break;
// 截几个
temp = s.substr(index, len);
if(judge(temp)){
path += temp+'.';
counter_path++;
visit(s, index+len);
path = path.substr(0, path.size() - len - 1);
counter_path--;
}
}
}
vector<string> restoreIpAddresses(string s) {
temp.clear();
visit(s, 0);
return result;
}
};
78.子集
思想:要把每一次访问的结果都push进去
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void bactracking(int index, vector<int>& nums){
if(path.size()>nums.size()) return;
result.push_back(path);
for(int i = index;i<nums.size();i++){
path.push_back(nums[i]);
bactracking(i+1,nums);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
bactracking(0,nums);
return result;
}
};
90.子集II
思想:先排序,当该字符串的开头和他下标的前一位相等时,跳过该下标对应的值,因为他所产生的结果已经被前一位包括了,把每次访问的结果都push进去。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(int index,vector<int>& nums){
if(index>nums.size()) return;
result.push_back(path);
for(int i = index;i<nums.size();i++){
if(i>index&&nums[i]==nums[i-1]) continue;
path.push_back(nums[i]);
backtracking(i+1,nums);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(0,nums);
return result;
}
};