• Day28——复原IP地址、子集、子集||


    28天了。突破80题。


    目录

    前言

    一、复原IP地址

    二、子集

    力扣

    三、子集||

    总结

    前言

    今日文案:

    看到这条信息你必须认真地按照我的要求去做,第一,对着镜子向自己微笑,第二,对着亲友向他们微笑


    一、复原IP地址

    要命的切割

    题目来源:

    力扣

    子集

    1. class Solution {
    2. public:
    3. vector ans;
    4. void backtracking(string s,int startindex,int point_sum)
    5. {
    6. if(point_sum==3) //打入了三个点就可以收割了
    7. {
    8. if(mypi(s,startindex,s.size()-1)) //判断是否符合条件,是的话就收入
    9. {
    10. ans.push_back(s);
    11. }
    12. return;
    13. }
    14. for(int i=startindex;isize();i++)
    15. {
    16. if(mypi(s,startindex,i)) //判断一组字符串是否符合条件
    17. {
    18. s.insert(s.begin()+i+1,'.'); //符合就插入点
    19. point_sum++; //记录+1
    20. backtracking(s,i+2,point_sum); //i+2是因为打入了一个点,i+1+1
    21. point_sum--; //回溯
    22. s.erase(s.begin()+i+1);
    23. }
    24. else
    25. {
    26. break; 如果不符合条件了,这层再继续下去也没有意义,剪枝
    27. }
    28. }
    29. }
    30. bool mypi(string s,int begin,int end)
    31. {
    32. if(begin>end)
    33. {
    34. return false;
    35. }
    36. if(s[begin]=='0'&&end!=begin) //开头不为0
    37. {
    38. return false;
    39. }
    40. int sum=0;
    41. for(int i=begin;i<=end;i++)
    42. {
    43. if(s[i]>'9'&&s[i]<'0') //不能是非正整数
    44. {
    45. return false;
    46. }
    47. sum=sum*10+(s[i]-'0'); //不能超过255
    48. if(sum>255)
    49. {
    50. return false;
    51. }
    52. }
    53. return true;
    54. }
    55. vector restoreIpAddresses(string s) {
    56. if(s.size()==0)
    57. {
    58. return ans;
    59. }
    60. backtracking(s,0,0);
    61. return ans;
    62. }
    63. };


    二、子集

    给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

    解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

    力扣

    1. class Solution {
    2. public:
    3. vector<int> path;
    4. vectorint>> ans;
    5. void backtracking(vector<int> nums,int startindex)
    6. {
    7. ans.push_back(path); //有就直接插入
    8. for(int i=startindex;isize();i++) //广度遍历
    9. {
    10. path.push_back(nums[i]); //插入
    11. backtracking(nums,i+1); //下一层,i+1,从下一个开始,不会重复
    12. path.pop_back(); //回溯
    13. }
    14. }
    15. vectorint>> subsets(vector<int>& nums) {
    16. if(nums.size()==0)
    17. {
    18. return ans;
    19. }
    20. backtracking(nums,0);
    21. return ans;
    22. }
    23. };

    三、子集||

    力扣

    给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

    解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

    1. class Solution {
    2. public:
    3. vector<int> path;
    4. vectorint>> ans;
    5. void backtracking(vector<int> nums,vector<bool>use,int startindex)
    6. {
    7. ans.push_back(path);
    8. for(int i=startindex;isize();i++)
    9. {
    10. if(i>0&&use[i-1]==false&&nums[i]==nums[i-1]) //判断同树层是否用过
    11. {
    12. continue;
    13. }
    14. path.push_back(nums[i]);
    15. use[i]=true; //同树枝用,让他可以深度下去
    16. backtracking(nums,use,i+1);
    17. path.pop_back();
    18. use[i]=false; //置回false,因为出去就是下一个树层,不是树枝了
    19. }
    20. }
    21. vectorint>> subsetsWithDup(vector<int>& nums) {
    22. if(nums.size()==0)
    23. {
    24. return ans;
    25. }
    26. sort(nums.begin(),nums.end()); //排序,让一样的元素挨着
    27. vector<bool>use(nums.size(),false);
    28. backtracking(nums,use,0);
    29. return ans;
    30. }
    31. };

    总结

    数层和树枝问题更加清晰了,分割还要继续熟悉,加油加油

  • 相关阅读:
    Cloudflare实现反代的两种方式,其中一种支持CNAME域名接入
    HTTP初步学习总结
    小程序中实现excel数据的批量导入
    最新最管用的nvm安装步骤及nvm报443超时解决方案
    chapter2——时钟和复位
    Selenium WebDriver 中用于查找网页元素的两个方法
    《STL容器篇》-string模拟实现
    Docker搭建DNS服务器--nouse
    数字孪生技术的实用价值在哪里?用四个案例为你解答
    如何实现一个AI聊天功能
  • 原文地址:https://blog.csdn.net/m0_72503424/article/details/127749194