题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html
视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/
class Solution {
//数字字符串-》数字 不用实现
//插入·相当于分割————直接在s中进行插入
//判断是否在0-255之间,且分割点.后面一个元素不能为0——judge函数实现
//backtracking的终止条件:分割点达到三——>用pointNum记录
public:
vector<string> result;
//判断字符串[start,end]区间内的子串转化的数字是否合法
bool judge(const string& s,int start,int end) {
//左右边界
if(start > end) {
return false;
}
//不能出现前导0(点后第一个元素不为0且不止一个元素)
if(s[start]=='0' && start!=end) {
return false;
}
int num=0;
//判断是否大于255
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;
}
void backtracking(string& s,int startIndex,int pointNum){
if(pointNum==3)
{
//剩余的元素也要判断一下是否合法
if(judge(s,startIndex,s.size()-1))
result.push_back(s);
return;
}
for(int i=startIndex;i<s.size();i++)
{
if(judge(s,startIndex,i)) {
//直接在s中插入,注意插入点的下标
s.insert(s.begin()+i+1,'.');
pointNum++;
//新传入的startIndex从i+2开始
backtracking(s,i+2,pointNum);
//撤销
pointNum--;
s.erase(s.begin()+i+1);
}else
break;
}
}
vector<string> restoreIpAddresses(string s) {
backtracking(s,0,0);
return result;
}
};
题目链接/文章讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html
视频讲解:https://www.bilibili.com/video/BV1U84y1q7Ci
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;
}
};
今天的思路写的有点乱…
题目链接/文章讲解:https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html
视频讲解:https://www.bilibili.com/video/BV1vm4y1F71J
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,int startIndex,vector<bool>& used) {
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, i+1, used);
used[i] = false;
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool> used(nums.size(),false);
sort(nums.begin(),nums.end());
backtracking(nums,0,used);
return result;
}
};