一、复原IP地址
这题切割的方式有点新颖, 不像之前用startindex下标直接切割,而是定义了一个变量来存放’.'判断终止的条件也比较新,点的数量为3的时候,并且剩下的部分判断是否合法,二者同时满足时递归停止,录入结果数组。
需要注意的点:
1.s.insert()方法,用于给字符串插入元素,用法是:想给哪个下标前面插入元素,就把下标的迭代器传进insert内第一个参数,后边的是要插入的元素
2.s.erase()方法,方法同上,用于删除字符串中某一个元素
3.pointnum变量的使用
class Solution {
public:
vector<string>result;
bool islegal(string&s,int start,int end){
if(start>end)return false;
if(s[start]=='0'&&start!=end)return false;
int sum=0;
for(int i = start;i<= end;i++){
if(s[i]<'0'||s[i]>'9')return false;
sum=sum*10+(s[i]-'0');
if(sum>255)return false;
}
return true;
}
void backtracking(string&s,int startindex,int pointnum){
if(pointnum==3){
if(islegal(s,startindex,s.size()-1)){
result.push_back(s);
}
return ;
}
for(int i=startindex;i<s.size();i++){
if(islegal(s,startindex,i)){
s.insert(s.begin()+1+i,'.');
pointnum++;
backtracking(s,i+2,pointnum);
pointnum--;
s.erase(s.begin()+1+i);
}
else continue;
}
}
vector<string> restoreIpAddresses(string s) {
if(s.size()<4||s.size()>12)return result;
backtracking(s,0,0);
return result;
}
};
二、子集
有点蒙蒙的这里,result.push_back()操作提前这一步也让我很难自己想到,后边的每一个集合让我自己找的话有点困难。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>nums,int startindex){
result.push_back(path);
if(startindex>=nums.size())
{
return;
}
for(int i=startindex;i<nums.size();i++){
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
三、子集Ⅱ
这题加深了我对剪枝操作的理解,used数组在纵向上表现为用过了就赋值为1,横向上表现为没用过默认为0,所以剪枝的条件是used[i-1]==0
另外,函数中used数组需要用到引用符号,因为这个数组需要在递归时保留上一步操作的数
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>nums,int startindex,vector<bool>&used){
result.push_back(path);
if(startindex>=nums.size())return;
for(int i = startindex;i<nums.size();i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)continue;
path.push_back(nums[i]);
used[i]=true;
backtracking(nums,i+1,used);
used[i]=false;
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool>used={0};
backtracking(nums,0,used);
return result;
}
};