复原IP地址
思路
我的思路是用vector来记录 path,当到终止条件时再设计一个string来接受
if(path.size()>4)
return;
if(path.size()==4){
if(startindex==s.size()){
string temp;
for(int num:path){
temp+=to_string(num);
temp+=".";
}
temp.pop_back();
result.push_back(temp);
}
return;
}
接下来还要写一个判断是否是符合条件的判断;
bool istrue(string s)
if(s[0]=='0'&&s.size()!=1)
return false;
int number=stoi(s);
return number>=0&&number<=255;
然后就是回溯过程:
void backtracking(string s,int startindex){
.....
..
for(int i=startindex;i<s.size();i++){
string t(s.begin()+startindex,s.begin()+i+1);
if(istrue(t)){
path.push_back(stoi(t));
backtracking(startindex,i+1);
path.pop_back();
}
else
return;
}
}
子集
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void zuhe(vector<int> nums,int startindex){
result.push_back(path);//注意每次递归时都要记录
if(path.size()==nums.size())
return;
for(int i=startindex;i<nums.size();i++){
//如果放在这里记录的话,那么在记录完最后一位后,进入下一层递归时,path.size满足上面返回的条件,所以会少记录一次。
path.push_back(nums[i]);
zuhe(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
int start=0;
zuhe(nums,start);
return result;
}
};
子集2
和上面一样,注意排序后去重就行
去重代码:
if(i>startindex&&nums[i]==nums[i-1])
continue;