详细布置
93.复原IP地址
本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了
题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html
视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/
Tips:下面是自己写出的题解,虽然和carl的实现方式略有不同,但是思路是差不多的。
我的题解:
class Solution {
public:
vector<string> result;
vector<string> path;
void backtracking(string s, int pos){
if(pos == s.size() && path.size() == 4){
string temp = "";
for(int i = 0; i<path.size(); i++){
temp += path[i] + ".";
}
temp.pop_back();
result.push_back(temp);
return;
}
for(int i = pos; i<s.size() && (i - pos) <=3 ; i++){
string front = s.substr(pos, i - pos + 1);
if(judge(front)){
path.push_back(front);
backtracking(s,i+1);
path.pop_back();
}
}
}
bool judge(string str){
if(str.size()>=2&&str[0] == '0'){
return false;
}
int num = 0;
for(int i=0; i<str.size();i++){
if(str[i]>'9' || str[i] < '0'){
return false;
}
num = num * 10 + (str[i] - '0');
}
if(num >255){
return false;
}
return true;
}
vector<string> restoreIpAddresses(string s) {
backtracking(s,0);
return result;
}
};
78.子集
子集问题,就是收集树形结构中,每一个节点的结果。 整体代码其实和 回溯模板都是差不多的。
题目链接/文章讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html
视频讲解:https://www.bilibili.com/video/BV1U84y1q7Ci
Tips:子集其实就是在每次更新path的时候都将结果加入到result当中去即可。
我的题解:
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int pos){
if(pos >= nums.size()){
return;
}
for(int i = pos; i< nums.size(); i++){
path.push_back(nums[i]);
result.push_back(path);
backtracking(nums, i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
result.push_back(path);
backtracking(nums,0);
return result;
}
};
90.子集II
大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。
题目链接/文章讲解:https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html
视频讲解:https://www.bilibili.com/video/BV1vm4y1F71J
Tips:回溯时记得也要更新used数组的状态
我的题解:
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int pos, vector<bool>& used){
if(pos >= nums.size()){
return;
}
for(int i = pos; i < nums.size(); i++){
if(i >= 1 && nums[i] == nums[i-1] && used[i-1] == false){
continue;
}
path.push_back(nums[i]);
result.push_back(path);
used[i] = true;
backtracking(nums, i+1, used);
used[i] = false;
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool> used(nums.size(),false);
sort(nums.begin(), nums.end());
result.push_back(path);
backtracking(nums, 0, used);
return result;
}
};
标签:return,nums,28,back,vector,子集,result,path,Day
From: https://www.cnblogs.com/GavinGYM/p/17077607.html