93.复原IP地址
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
backtracking(s,0,0);
return ans;
}
private:
vector<string> ans;
void backtracking(string s,int st,int point){
if(st==s.size()&&point==4){
s.pop_back();
ans.emplace_back(s);
return ;
}
for(int i=st;i<s.size();++i){
if(isvalid(s,st,i)){
s.insert(i+1,".");
backtracking(s,i+2,point+1);
s.erase(i+1,1);
}else continue;
}
}
bool isvalid(const string&s,int st,int en){
int cou = en-st+1;
if(cou>1&&s[st]=='0') return false;
int sum = 0;
while(st<=en){
sum = sum*10 + (s[st]-'0');
if(sum>255) return false;
++st;
}
return true;
}
};
代码中需要注意的地方:
1.递归终止的边界,需要同时满足两个条件“st == s.size()、point ==4”其中st表示子字符串的起始位置,point表示字符串中点‘.’的个数。“s.pop_back()”的意思是去除满足条件的字符串中的最后一个’.';
if(st==s.size()&&point==4){
s.pop_back();
ans.emplace_back(s);
return ;
}
2.有关string的一些操作。
insert函数
string& insert(size_t pos,const string&str);
string& insert(size_t pos,const string&str,size_t subpos,size_t sublen);
78.子集
链接:LeetCode78.子集
本题的本质还是组合。由于数组所有可能的子集的长度都不一致,所以终止边界里没有写“return”语句。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return ans;
}
private:
vector<vector<int>> ans;
vector<int> res;
void backtracking(const vector<int>&nums,int st){
if(res.size()>=0){
ans.emplace_back(res);
}
for(int i=st;i<nums.size();++i){
res.emplace_back(nums[i]);
backtracking(nums,i+1);
res.pop_back();
}
}
};
90.子集||
链接:LeetCode90.子集||
去重的组合
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(nums,0);
return ans;
}
private:
vector<vector<int>> ans;
vector<int> res;
void backtracking(const vector<int>&nums,int st){
if(res.size()>=0){
ans.emplace_back(res);
}
for(int i=st;i<nums.size();++i){
if(i>st&&nums[i]==nums[i-1]) continue;
res.emplace_back(nums[i]);
backtracking(nums,i+1);
res.pop_back();
}
}
};