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

Leetcode 93. 复原 IP 地址

链接93. 复原 IP 地址

thought:

for循环遍历所有s的字符,当当前字符段满足条件,塞入path,并进行递归,寻找下一个字符段,直到有三个点的存在,若最后一个剩下的字符段也满足条件,直接塞入res,return即可。然后进行回溯,开始找下一个字符段

完整C++代码如下

class Solution {
public:
    vector<string> res;
    string path;
    int pointNum = 0;
    
    vector<string> restoreIpAddresses(string s) {
        backtracking(0, s);
        return res;
    }
    
    void backtracking(int start, string s) {
        if (pointNum == 3) {
            string cur = s.substr(start);
            if (isValid(cur)) {
                res.push_back(path + cur);
            }
            return;
        }
        
        for (int i = start; i < s.length(); i++) {//本层找所有情况
            string cur = s.substr(start, i - start + 1);
            if (isValid(cur)) {//本层满足,塞进path并递归
                int len = path.length();
                path += cur + ".";//本层已确定
                pointNum++;
                backtracking(i + 1, s);//向下递归下一层
                path = path.substr(0, len);//回溯
                pointNum--;//回溯
            } else {
                break;//此情况已经没有后续向下递归的必要
            }
        }
    }
    
    bool isValid(string str) {
        if (str.empty() || str.length() > 3 || (str[0] == '0' && str.length() > 1))
            return false;
        int num = stoi(str);
        return num >= 0 && num <= 255;
    }
};


Leetcode 78. 子集

链接78. 子集

thought:

  • 递归中处理随函数变化变量或储存结果变量的两种方法:1.设为全局变量 2.作为参数传入递归函数
  • 本题只是递归的过程中,每轮递归都存储当前path

完整C++代码如下

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>path;
        backTrack(nums,path,0,res);
        return res;
    }
    void backTrack(vector<int>&nums,vector<int>&path,int start,vector<vector<int>>&res){
        res.push_back(path);
        for(int i=start;i<nums.size();i++){
            path.push_back(nums[i]);
            backTrack(nums,path,i+1,res);
            path.pop_back();
        }
    }

};

Leetcode 90.子集II

链接90.子集II

thought:

比上一题多的情况是数组中的数可以是重复的,先排序,避免重复存相同数组的情况

完整C++代码如下

class Solution {
private:
    void backtracking(vector<vector<int>>& ans,vector<int>& cur,vector<int>& nums, int start) {
        ans.push_back(cur);
        for(int i = start;i<nums.size();i++){
            if(i>start && nums[i]==nums[i-1])continue;//避免重复情况,例如[1,2,2]第1和第2结合,第1和第3结合
            cur.push_back(nums[i]);
            backtracking(ans,cur,nums, i+1);//递归
            cur.pop_back();//回溯
        }
    }

public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> cur;
        sort(nums.begin(), nums.end());
        backtracking(ans,cur,nums, 0);
        return ans;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值