题目:93.复原IP地址
文章链接:代码随想录
视频链接:LeetCode:93.复原IP地址
题目链接:力扣题目链接
解法1:
class Solution {
public:
vector<string> result;
bool isIpAddresses(const 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;
}
void backtracking(string s, int startIndex, int pointSum){//pointSum逗点数量
// 终止条件
if(pointSum == 3){
if(isIpAddresses(s, startIndex, s.size()-1)) // 并且到字符最后的子串都满足IP,则进行添加
{
result.push_back(s);
return;
}
}
// 树层逻辑
for(int i=startIndex; i<s.size(); i++){
// 判断是否满足有效IP [startIndex,i] 闭区间
if(isIpAddresses(s, startIndex, i)){ // startIndex = 0
// 插入逗点
s.insert(s.begin()+i+1, '.'); // 2.5525511135
pointSum++;
backtracking(s, i+2, pointSum); // startIndex = 3
pointSum--;
s.erase(s.begin()+i+1); // 25525511135
}
}
}
vector<string> restoreIpAddresses(string s) {
result.clear();
if(s.size()<4) return result;
backtracking(s,0,0);
return result;
}
};
题目:78.子集
文章链接:代码随想录
视频链接:LeetCode:78.子集
题目链接:力扣题目链接
解法1:
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,int startIndex){
// 刚调用的时候,path = [] 直接传入result中
result.push_back(path); //把每一步都放进结果中
if(startIndex >= nums.size()){
return ;
}
for(int i=startIndex; i<nums.size(); i++){
path.push_back(nums[i]); // path=[1]
backtracking(nums, i+1); // 再进下一层 [1,2]
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
result.clear();
path.clear();
backtracking(nums,0);
return result;
}
};
题目:90.子集II
文章链接:代码随想录
视频链接:LeetCode:90.子集||
题目链接:力扣题目链接
解法1:
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums, int startIndex, vector<bool>used){
result.push_back(path);
for(int i=startIndex; i<nums.size(); i++){
// 针对的是树层结构,在for循环里面去重
if(i>0 && used[i-1]==false && nums[i]==nums[i-1]){
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) {
result.clear();
path.clear();
vector<bool> used(nums.size(), false);
sort(nums.begin(), nums.end());
backtracking(nums, 0, used);
return result;
}
};