代码随想录算法训练营第25天|93.复原IP地址、 78.子集、90.子集II

93.复原IP地址

题目链接:93. 复原 IP 地址

思想:常规回溯模板,这次插入的元素是长度为1-3的字符串,而且第一位必须从输入字符串的第一个开始,所以针对每个分出来的字符串要做合理性判断,如果满足条件,则push进path,path中字符串个数为4并且已访问完最后一个元素时则push进result。

class Solution {
public:
    vector<string> result;
    string path;
    int counter_path = 0;
    int index = 0;
    string temp;

    bool judge(string temp){
        if (temp.size() > 1 && temp[0] == '0')  return false;
        if(temp.size() > 3) return false;
        int num = stoi(temp);
        return num >= 0 && num <= 255;
    }
    // 四段字符串返回一次
    void visit(string s, int index) {
        // 难点:怎么处理0 两种情况:一种是当前字符串大小大于1且第一位是0
        // 另一种是 当前字符串大小等于1 且这一位是0
        // 除此之外,大小不在0-255之间的 去掉
        // for循环中循环次数的选择,每段不可以大于3位 所以计数到3就停止
        
        if (counter_path == 4&&index==s.size()) {
            // 插入字符串时要把当前字符串中末尾的‘.’给去掉,这里是求了一个子串
            result.push_back(path.substr(0, path.size() - 1));
            return;
        }
        if (counter_path == 4 || index == s.size()) {
            return;
        }
        // 从哪个位置开始截
        for (int len = 1; len < 4; len++) {
            if(index+len>s.size())break;
            // 截几个
            temp = s.substr(index, len);
            if(judge(temp)){
                path += temp+'.';
            counter_path++;
            visit(s, index+len);
            path = path.substr(0, path.size() - len - 1);
            counter_path--;
            }
            
        }
    }
    vector<string> restoreIpAddresses(string s) {
        temp.clear();
        visit(s, 0);
        return result;
    }
};

78.子集

题目链接:78. 子集

思想:要把每一次访问的结果都push进去

class Solution {
public:
vector<vector<int>> result;
vector<int> path;
    void bactracking(int index, vector<int>& nums){
        if(path.size()>nums.size()) return;
        result.push_back(path);
        for(int i = index;i<nums.size();i++){
            path.push_back(nums[i]);
            bactracking(i+1,nums);
            path.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        bactracking(0,nums);
        return result;
    }
};

90.子集II

题目链接:90. 子集 II

思想:先排序,当该字符串的开头和他下标的前一位相等时,跳过该下标对应的值,因为他所产生的结果已经被前一位包括了,把每次访问的结果都push进去。

class Solution {
public:

vector<vector<int>> result;
vector<int> path;
    void backtracking(int index,vector<int>& nums){
        if(index>nums.size()) return;
        result.push_back(path);
        for(int i = index;i<nums.size();i++){
            if(i>index&&nums[i]==nums[i-1]) continue;
            path.push_back(nums[i]);
            backtracking(i+1,nums);
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        backtracking(0,nums);
        return result;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值