1.复原IP地址
题目链接/文章讲解:代码随想录
代码:
class Solution {
private:
vector<string> result;
void backtracking(string &s,int startIndex,int pointNum){
if(pointNum == 3){
if(isValid(s,startIndex,s.size() - 1)){
result.push_back(s);
}
return;
}
for(int i = startIndex; i < s.size(); i++){
if(isValid(s,startIndex,i)){
s.insert(s.begin() + i + 1,'.');
pointNum++;
backtracking(s,i + 2,pointNum);
pointNum--;
s.erase(s.begin() + i + 1);
}else{
break;
}
}
}
bool isValid(string &s,int start,int end){
if(start > end){
return false;
}
if(s[start] == '0' && start != end){
return false;
}
int num = 0;
for(int i = start; i <= end; i++){
if(s[i] > '9' || s[i] < '0'){
return false;
}
num = num * 10 + (s[i] - '0');
if(num > 255){
return false;
}
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
if(s.size() < 4 || s.size() > 12){
return result;
}
backtracking(s,0,0);
return result;
}
};
note:对于insert和erase的用法还不熟悉
2.子集
题目链接/文章讲解:代码随想录
代码:回溯法
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int> &nums,int startIndex){
result.push_back(path);
if(path.size() == nums.size()){
return;
}
for(int i = startIndex; i < nums.size(); i++){
path.push_back(nums[i]);
backtracking(nums,i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
note:这里的终止条件不加也行,因为for循环自带终止条件。
3.子集2
题目链接/文章讲解:代码随想录
代码:
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,vector<bool> used,int startIndex){
result.push_back(path);
for(int i = startIndex; i < nums.size(); i++){
if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){
continue;
}
path.push_back(nums[i]);
used[i] = true;
backtracking(nums,used,i + 1);
used[i] = false;
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool> used(nums.size(),false);
sort(nums.begin(),nums.end());
backtracking(nums,used,0);
return result;
}
};
note:没有新的东西