今天的题目还好,除了第二道题看了一半视频,其他的自己写就AC了。
93.复原IP地址
这道题目和昨天的分割回文子串很像,不过这道题需要自己定义一个判断子字符串是否合法的函数,如果含有前导0或者超过3位直接pass,如果转化成整型变量,大于255也pass,其余的就是符合要求的,另外,本题还需要定义一个全局变量count,得到一个合法字符串就加到结果中,并且将count加一,只有当遍历到字符串末尾且count刚好为4时才将结果存入。
class Solution {
public:
vector<string> result;
string path;
int count = 0;
vector<string> restoreIpAddresses(string s) {
BackTracking(s, 0);
return result;
}
bool is_Valid(string s){ //判断子字符串是否合法
if(s.size() > 1 && s[0] == '0') //含有前导0
return false;
if(s.size() >= 4)
return false;
return stoi(s) <= 255 ? true : false;
}
void BackTracking(string s, int Start_Index){
//确定终止条件
if(Start_Index >= s.size() && count == 4){
path.resize(path.size() - 1);
result.push_back(path);
return ;
}
for(int i = Start_Index; i < s.size(); i++){
if(!is_Valid(s.substr(Start_Index, i - Start_Index + 1))) //子字符串非法
continue;
int SIZE = path.size();
count++;
path += s.substr(Start_Index, i - Start_Index + 1);
path += '.';
BackTracking(s, i + 1);
path.resize(SIZE);
count--;
}
}
};
78.子集
这道题目想了很久,实在想不出来才去看了会视频,卡哥一点就通,很顺利地就AC了。这一题的重点在于在每一个节点都收获结果,而不是在终止条件中收获结果,这一点和之前的回溯题目完全不一样。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
vector<vector<int>> subsets(vector<int>& nums) {
BackTracking(nums, 0);
result.push_back({});
return result;
}
void BackTracking(vector<int> &nums, int Start_Index){
//确定终止条件
if(Start_Index >= nums.size()) return ;
//单层递归逻辑
for(int i = Start_Index; i < nums.size(); i++){
path.push_back(nums[i]);
//在每一层递归都收获结果,而不是在终止条件
result.push_back(path);
BackTracking(nums, i + 1);
path.pop_back();
}
}
};
90.子集II
有了上一道题的基础,这道题做起来很快,这道题还和之前的树层去重很像,也是需要用到used数组来记录数字的使用情况,千万别忘了需要先对输入的数组进行升序排列,再送入递归函数中进行遍历。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
vector<int> used;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
used.resize(nums.size());
sort(nums.begin(), nums.end());
BackTracking(nums, 0);
result.push_back({});
return result;
}
void BackTracking(vector<int> &nums, int Start_Index){
//确定终止条件
if(Start_Index >= nums.size()) return ;
//确定单层递归逻辑
for(int i = Start_Index; i < nums.size(); i++){
if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) //重复情况
continue;
used[i] = 1;
path.push_back(nums[i]);
result.push_back(path);
BackTracking(nums, i + 1);
path.pop_back();
used[i] = 0;
}
}
};