代码随想录 DAY28 93.复原IP地址 78.子集 90.子集II

93.复原IP地址

切割字符串,并且在每一个切割过的字符串后面加上 ' .'

返回条件:逗点个数==3

如果最后一小节符合要求,就将该字符串添加到结果集中

循环中:从start到i 符合要求,就继续添加逗点和字符

不符合下面就不用看了。

不要试图一下找完,从第一个开始算。

cpp 复制代码
class Solution {
private:
vector <string> result;

    void transfer(string&s,int start,int pointnum){
        if(pointnum==3){
            if(isVaild(s,start,s.size()-1)){
                result.push_back(s);
            }
            return;
        }

        for(int i=start;i<s.size();i++){
            if(isVaild(s,start,i)){
                s.insert(s.begin() + i + 1,'.');
                pointnum++;
                transfer(s,i+2,pointnum);
                pointnum--;
                s.erase(s.begin()+i+1);
            }else{
                break;
            }
        }
    }

    bool isVaild(const string& s, int start, int end) {
        if (start > end) {
            return false;
        }
        if (s[start] == '0' && start != end) { // 0开头的数字不合法
                return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法
                return false;
            }
            num = num * 10 + (s[i] - '0');
            if (num > 255) { // 如果大于255了不合法
                return false;
            }
        }
        return true;
    }

public:
    vector<string> restoreIpAddresses(string s) {
        result.clear();
        if(s.size()<4||s.size()>12) return result;
        transfer(s,0,0);
        return result;
    }
};

78.子集

结束条件+回溯过程

cpp 复制代码
class Solution {
private:
vector<vector<int>> result;
vector<int> partset;

void transfer(vector<int>& nums,int start){
    result.push_back(partset);
    if(start>=nums.size()){
        return;
    }

    for(int i=start;i<nums.size();i++){
        partset.push_back(nums[i]);
        transfer(nums,i+1);
        partset.pop_back();
    }
}

public:
    vector<vector<int>> subsets(vector<int>& nums) {
        result.clear();partset.clear();
        transfer(nums,0);
        return result;
    }
};

90.子集II

只是判断生成的子集是否重复

子集重复就是数字重复,和上一级递归的数字比较是否使用过

cpp 复制代码
class Solution {
private:
vector<vector<int>> result;
vector<int> partset;

void transfer(vector<int>& nums,int start,vector<bool> used){
    result.push_back(partset);

    for(int i=start;i<nums.size();i++){
                  //数字重复             上一个已经使用过
        if(i>start&&nums[i]==nums[i-1]&&used[i-1]==false){
            continue;
        }
        used[i]==true;
        partset.push_back(nums[i]);
        transfer(nums,i+1,used);
        used[i]=false;
        partset.pop_back();
    }
}
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        result.clear();partset.clear();
        sort(nums.begin(),nums.end());
        vector<bool> used(nums.size(),false);
        transfer(nums,0,used);
        return result;
    }
};
相关推荐
嵌入式@秋刀鱼1 小时前
《第四章-筋骨淬炼》 C++修炼生涯笔记(基础篇)数组与函数
开发语言·数据结构·c++·笔记·算法·链表·visual studio code
嵌入式@秋刀鱼1 小时前
《第五章-心法进阶》 C++修炼生涯笔记(基础篇)指针与结构体⭐⭐⭐⭐⭐
c语言·开发语言·数据结构·c++·笔记·算法·visual studio code
简简单单做算法1 小时前
基于PSO粒子群优化的VMD-LSTM时间序列预测算法matlab仿真
算法·matlab·lstm·时间序列预测·pso·vmd-lstm·pso-vmd-lstm
无聊的小坏坏1 小时前
高精度算法详解:从原理到加减乘除的完整实现
算法
whoarethenext1 小时前
使用 C/C++的OpenCV 裁剪 MP4 视频
c语言·c++·opencv
愚润求学1 小时前
【递归、搜索与回溯】FloodFill算法(二)
c++·算法·leetcode
泽02021 小时前
C++之list的自我实现
开发语言·数据结构·c++·算法·list
斗转星移32 小时前
c++默认类模板参数
开发语言·c++
福理原乡大王2 小时前
Linux信号详解
linux·运维·服务器·c++·ubuntu·信号处理
扫地的小何尚2 小时前
全新NVIDIA Llama Nemotron Nano视觉语言模型在OCR基准测试中准确率夺冠
c++·人工智能·语言模型·机器人·ocr·llama·gpu