• Day28|Leetcode 93. 复原 IP 地址 Leetcode 78. 子集 Leetcode 90. 子集 II


    Leetcode 93. 复原 IP 地址

    题目链接 93 复原 IP 地址

    本题目也是分割的典型题目,属于分割回文子串的升级版,大概的思路都是一样的,注意几点,第一个是对ip地址正确与否的条件,第二个插入逗点后,下一个子串的起始位置为i+2,第三就是对于分割区间开闭的不变性和区间范围的取值([startIndex,i]),最后就是这里不仅要对单个区间段进行ip地址的判断,当pointNum==3时要对整体ip地址进行判断,下面上代码:

    1. class Solution {
    2. private:
    3. vector result;
    4. void backtracking(string&s,int startIndex,int pointNum){
    5. if(pointNum == 3){
    6. if(isValid(s,startIndex,s.size()-1)){//整体判断,左闭右闭
    7. result.push_back(s);
    8. }
    9. return ;
    10. }
    11. for(int i=startIndex;isize();i++){//左闭右闭
    12. if(isValid(s,startIndex,i)){
    13. s.insert(s.begin()+i+1,'.');
    14. pointNum++;
    15. backtracking(s,i+2,pointNum);//插入逗点之后下一个子串的起始位置为i+2
    16. pointNum--;//回溯
    17. s.erase(s.begin()+i+1);//删除逗点
    18. }else{
    19. break;
    20. }
    21. }
    22. }
    23. bool isValid(const string& s,int start,int end){
    24. if(start>end){//区间不存在
    25. return false;
    26. }
    27. if(s[start] == '0'&&start!=end){//头数字不能为0
    28. return false;
    29. }
    30. int num = 0;
    31. for(int i=start;i<=end;i++){
    32. if(s[i]>'9'||s[i]<'0'){//不能有符号
    33. return false;
    34. }
    35. num = num*10+(s[i]-'0');//不能大于255
    36. if(num>255){
    37. return false;
    38. }
    39. }
    40. return true;
    41. }
    42. public:
    43. vector restoreIpAddresses(string s) {
    44. if(s.size()<4||s.size()>12){//小小剪枝一下啊
    45. return result;
    46. }
    47. backtracking(s,0,0);
    48. return result;
    49. }
    50. };

    Leetcode 78. 子集

    题目链接 78 子集

    本题目和组合几乎是一样的,只有一点不同就是组合取得是叶子节点,而子集是取的全部节点,剩下的都一样,下面上代码:

    1. class Solution {
    2. private:
    3. vector<int> path;
    4. vectorint>> result;
    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;isize();i++){
    11. path.push_back(nums[i]);
    12. backtracking(nums,i+1);
    13. path.pop_back();
    14. }
    15. }
    16. public:
    17. vectorint>> subsets(vector<int>& nums) {
    18. backtracking(nums,0);
    19. return result;
    20. }
    21. };

    Leetcode 90. 子集 II

    题目链接 90 子集 II

    本题目就是子集1加上组合总和2的去重问题,不多说直接上代码:

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

    要学习六级了,好痛苦 end

  • 相关阅读:
    java计算机毕业设计景区失物招领平台演示录像源码+数据库+系统+lw文档+mybatis+运行部署
    会议OA项目-其它页面->自定义组件应用,其它界面的布局
    AcWing_第 78 场周赛
    FileNotFoundError: Could not find module ‘XXX\lib\site-packages\llvmlite
    xss漏洞及排查
    Android 实战项目:找回密码
    基于UDP的TFTP文件传输
    迅镭激光万瓦切割设备中标全球轨交装备龙头中国中车
    对比 elasticsearch 和 mysql
    VL1_四选一多路器(完整RTL、Testbench和覆盖率)
  • 原文地址:https://blog.csdn.net/weixin_72635630/article/details/134533973