代码随想录算法训练营第36期DAY30

万事开头难,日拱一卒地前进吧。

DAY30

93复原ip地址

十分困难,有很多细节。加油吧,日拱一卒的前进,毕竟万事开头难。

待二刷。

  1. class Solution {
  2. private:
  3.     bool isip(string s,int left,int right){
  4.         if(left>right) return false;
  5.         if(s[left]=='0'&&left!=right) return false;
  6.         int num=0;
  7.         for(int i=left;i<=right;i++){
  8.             if(s[i]<'0'||s[i]>'9'){
  9.                 return false;
  10.             }
  11.             num=num*10+(s[i]-'0');
  12.             if(num>255return false;
  13.         }
  14.         return true;
  15.     }
  16.     vector<string>result;
  17.     void backtracking(string &s,int startindex,int pointsum){
  18.         if(pointsum==3){
  19.             if(isip(s,startindex,s.size()-1)) result.push_back(s);
  20.         return ;
  21.         }
  22.         for(int i=startindex;i<s.size();i++){
  23.             if(isip(s,startindex,i)){
  24.                 s.insert(s.begin()+i+1,'.');
  25.                 pointsum++;
  26.                 backtracking(s,i+2,pointsum);
  27.                 s.erase(s.begin()+i+1);
  28.                 pointsum--;
  29.             }else break;
  30.         }
  31.     }
  32. public:
  33.     vector<stringrestoreIpAddresses(string s) {
  34.         result.clear();
  35.         if(s.size()<4||s.size()>12return result;
  36.         backtracking(s,0,0);
  37.         return result;
  38.     }
  39. };

78子集

与之前的回溯不同,子集问题的答案存在于树形结构的每一个节点当中。

待二刷:

  1. class Solution {
  2. private:
  3.     vector<vector<int>> result;
  4.     vector<int> path;
  5.     void backtracking(vector<int>&nums,int startindex){
  6.         result.push_back(path);
  7.         if(startindex>=nums.size()){
  8.             return;
  9.         }
  10.         for(int i=startindex;i<nums.size();i++){
  11.             path.push_back(nums[i]);
  12.             backtracking(nums,i+1);
  13.             path.pop_back();
  14.         }
  15.     }
  16. public:
  17.     vector<vector<int>> subsets(vector<int>& nums) {
  18.         result.clear();
  19.         path.clear();
  20.         if(nums.size()==0return result;
  21.         backtracking(nums,0);
  22.         return result;
  23.     }
  24. };

90子集ii

  1. class Solution {
  2. private:
  3.     vector<vector<int>> result;
  4.     vector<int> path;
  5.     void backtracking(vector<int>& nums,int startindex,vector<bool>&used){
  6.     result.push_back(path);
  7.     if(startindex>=nums.size()) return ;
  8.     for(int i=startindex;i<nums.size();i++){
  9.         if(i>0&&nums[i]==nums[i-1]&&used[i-1]==falsecontinue;
  10.         path.push_back(nums[i]);
  11.         used[i]=true;
  12.         backtracking(nums,i+1,used);
  13.         path.pop_back();
  14.         used[i]=false;
  15.     }
  16.     }
  17. public:
  18.     vector<vector<int>> subsetsWithDup(vector<int>& nums) {
  19.     result.clear();
  20.     path.clear();
  21.     if(nums.size()==0return result;
  22.     sort(nums.begin(),nums.end());
  23.     vector<bool>used(nums.size(),false);
  24.     backtracking(nums,0,used);
  25.     return result;
  26.     }
  27. };

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值