28天了。突破80题。
目录
今日文案:
看到这条信息你必须认真地按照我的要求去做,第一,对着镜子向自己微笑,第二,对着亲友向他们微笑
要命的切割
题目来源:
子集
- class Solution {
- public:
-
- vector
ans; - void backtracking(string s,int startindex,int point_sum)
- {
- if(point_sum==3) //打入了三个点就可以收割了
- {
- if(mypi(s,startindex,s.size()-1)) //判断是否符合条件,是的话就收入
- {
- ans.push_back(s);
- }
- return;
- }
-
- for(int i=startindex;i
size();i++) - {
- if(mypi(s,startindex,i)) //判断一组字符串是否符合条件
- {
- s.insert(s.begin()+i+1,'.'); //符合就插入点
- point_sum++; //记录+1
- backtracking(s,i+2,point_sum); //i+2是因为打入了一个点,i+1+1
- point_sum--; //回溯
- s.erase(s.begin()+i+1);
- }
- else
- {
- break; 如果不符合条件了,这层再继续下去也没有意义,剪枝
- }
- }
- }
-
- bool mypi(string s,int begin,int end)
- {
- if(begin>end)
- {
- return false;
- }
- if(s[begin]=='0'&&end!=begin) //开头不为0
- {
- return false;
- }
- int sum=0;
- for(int i=begin;i<=end;i++)
- {
-
- if(s[i]>'9'&&s[i]<'0') //不能是非正整数
- {
- return false;
- }
- sum=sum*10+(s[i]-'0'); //不能超过255
- if(sum>255)
- {
- return false;
- }
- }
- return true;
- }
-
- vector
restoreIpAddresses(string s) { - if(s.size()==0)
- {
- return ans;
- }
- backtracking(s,0,0);
- return ans;
- }
- };
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
- class Solution {
- public:
-
- vector<int> path;
- vector
int>> ans; -
- void backtracking(vector<int> nums,int startindex)
- {
- ans.push_back(path); //有就直接插入
-
-
- for(int i=startindex;i
size();i++) //广度遍历 - {
- path.push_back(nums[i]); //插入
- backtracking(nums,i+1); //下一层,i+1,从下一个开始,不会重复
- path.pop_back(); //回溯
- }
- }
- vector
int>> subsets(vector<int>& nums) { - if(nums.size()==0)
- {
- return ans;
- }
- backtracking(nums,0);
- return ans;
- }
- };
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
- class Solution {
- public:
-
- vector<int> path;
- vector
int>> ans; -
- void backtracking(vector<int> nums,vector<bool>use,int startindex)
- {
- ans.push_back(path);
-
- for(int i=startindex;i
size();i++) - {
- if(i>0&&use[i-1]==false&&nums[i]==nums[i-1]) //判断同树层是否用过
- {
- continue;
- }
-
- path.push_back(nums[i]);
- use[i]=true; //同树枝用,让他可以深度下去
- backtracking(nums,use,i+1);
- path.pop_back();
- use[i]=false; //置回false,因为出去就是下一个树层,不是树枝了
- }
-
- }
- vector
int>> subsetsWithDup(vector<int>& nums) { - if(nums.size()==0)
- {
- return ans;
- }
- sort(nums.begin(),nums.end()); //排序,让一样的元素挨着
- vector<bool>use(nums.size(),false);
- backtracking(nums,use,0);
- return ans;
- }
- };
数层和树枝问题更加清晰了,分割还要继续熟悉,加油加油