以下是今日份的总结
93 复原IP地址
78 子集
90 子集II
今天的题目难度不低,尽量还是写一些简洁代码 ^ _ ^
复原IP地址
思路:
用小数点作为分割手段进行插入,每次插入对string进行判断,直到符合条件才插入vector
值得注意的是
char的比较条件单个字符要加 ‘ ’ 单引号
对于有长度参与的参与,需要确定好区间的开闭和数值
递归
vector<string>res;
bool isValid(string s, int begin, int end){
//当前分割间隔超过了结尾
if(end<begin) return false;
//筛选开头是0的不合法数字,是char的比较条件,这里是s[begin]=='0'
if(s[begin]=='0'&&begin!=end) return false;
int num = 0;//用于string转换int
//逐个数字对比
for(int i = begin;i<=end;i++){
//筛选非数字
if(s[i]>'9'||s[i]<'0') return false;
//数字处理
num = num*10+(s[i]-'0');//255 >> 2 -> 25 -> 255
if(num>255) return false;
}
return true;
}
void backtrack(string &s,int start, int point){
//终止条件
if(point == 3){
if(isValid(s, start, s.size()-1)){//就判断最后一个ip段合不合法就行
res.push_back(s);
return;
}
}
for(int i = start;i<s.size();i++){
//符合条件进入递归
if(isValid(s, start, i)){//判断的是[start,i]这个区间
point++;
//是在当前元素后面插入一个‘.’,所以要+1
s.insert(s.begin()+i+1,'.');
backtrack(s, i+2, point);
//把前面加的这个点删了
s.erase(s.begin()+i+1);
point--;
}else{
break;
}
}
}
vector<string> restoreIpAddresses(string s) {
if(s.size()<4||s.size()>12)return res;
backtrack(s, 0, 0);
return res;
}
子集
思路:
遍历整个数组,输出所有子集
值得注意的是
是否增加循环终止条件,最终都是要遍历所有子集的
递归
vector<vector<int>> res;
vector<int> vec;
void backTrack(vector<int>& nums, int start) {
//直接插入vec,空集也是子集
res.push_back(vec);
//递归
for (int i = start; i < nums.size(); i++) {
vec.push_back(nums[i]);
backTrack(nums, i+1);
vec.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
if (nums.size() == 0) {
return res;
}
backTrack(nums, 0);
return res;
}
子集II
思路:
在上一题的基础上加入去重操作
要对同一层使用过的元素进行跳过
值得注意的是
去重需要先排序,
递归
vector<vector<int>> res;
vector<int> vec;
void backTrack(vector<int>& nums, int start) {
// 插入
res.push_back(vec);
if(start>nums.size())return;
// 递归
for (int i = start; i < nums.size(); i++) {
// 而我们要对同一树层使用过的元素进行跳过
if (i > start && nums[i] == nums[i - 1]) {//i > start 比较关键
continue;
} else {
vec.push_back(nums[i]);
backTrack(nums, i + 1);
vec.pop_back();
}
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
if (nums.size() == 0)
return res;
sort(nums.begin(),nums.end());
backTrack(nums, 0);
return res;
}
写在最后
----OK,今日份的博客就写到这里,这一期的回溯法很巧秒啊,也涉及到去重,明天继续加油!!!
—看了看下期的题,但是我的栈还有一节没写;
–追上时间进度了吗?如追,从欠三天变成欠二天!!(笑
-视野良好,允许降落。