代码随想录Day24_回溯_复原IP.md

复原IP地址

题目理解

1.给出的是字符串,IP地址在【0,255】之间,字符串转数字;

2.0可以单独出现,但是不能跟数字出现;

3.字符串中要插入'.';

4.字符串的大小范围在4~12之间;

5.不能有除数字外的字母;

思路

首先确定答案类型:vector<string> res,一个用来存单个有效IP地址的字符串str;

1.函数返回值:void,函数参数,传进来的string s;

2.确定终止条件:插入4个'.'后;

3.单层回溯:

for循环遍历树的宽度:每次startIndex后移一位;

树的深度:每次.后移一位。后移两位。

问题

1.怎么在字符串中插入.? s.insert(pos,'neirong')

if(start>end){return false;}该条件是在处理空的字符串!很难想到这个边界条件。

复制代码
class Solution {
public:
    vector<string> res;
    void backtrack(string& s, int startIndex, int pointNum) {
        if (pointNum == 3) {
            if (isValid(s, startIndex, s.size() - 1)) {
                res.push_back(s);
            }
            return;
        }
        for (int i = startIndex; i < s.size(); i++) {
            if (isValid(s, startIndex, i)) {
                s.insert(s.begin() + i + 1, '.');
                pointNum++;
                backtrack(s, i + 2, pointNum);
                s.erase(s.begin() + i + 1);
                pointNum--;
            } else {
                break;
            }
        }
        return;
    }
    bool isValid(const string& s, int start, int end) {
        if (start > end) {
            return false;
        } // 输入:s=101023     输出:10.102.3.
        if (s[start] == '0' && start != end) {
            return false;
        }
        int sum = 0;
        for (int i = start; i <= end; i++) {
            if (s[i] < '0' || s[i] > '9') {
                return false;
            }
            // 255逻辑
            sum = sum * 10 + (s[i] - '0');
            if (sum > 255) {
                return false;
            }
        }
        return true;
    }
    vector<string> restoreIpAddresses(string s) {
        backtrack(s, 0, 0);
        return res;
    }
};

求整数数组的所有子集

开始的时候在想每个整数数组都包含一个空的子集如何处理?写出来了但是不知道在哪里处理到了?

复制代码
class Solution {
public:
    vector<int>path;
    vector<vector<int>>  res;
    void backtrack(vector<int>&nums, int startIndex){
        res.push_back(path);
        if(startIndex>=nums.size()){
            return;
        }
        for(int i=startIndex;i<nums.size();i++){
            path.push_back(nums[i]);
            backtrack(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        res.clear();
        path.clear();
        backtrack(nums,0);
        return res;
    }
};

求存在重复元素的整数数组的子集

事情开始变得诡异起来了

让我再梳理一下事情的发生过程:

复用不存在重复元素的整数数组子集的代码;

其次,结果用set存下来,使用类型转换;

给path排序,发生了:

换给nums排序程序奇怪地运行起来了。

不懂。

复制代码
class Solution {
public:
    vector<int>path;
    set<vector<int>>  res;
    void backtrack(vector<int>&nums, int startIndex){
        res.insert(path);
        if(startIndex>=nums.size()){
            return;
        }
        for(int i=startIndex;i<nums.size();i++){
            path.push_back(nums[i]);
            backtrack(nums,i+1);
            path.pop_back();
            //} 
        }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
       sort(nums.begin(),nums.end());
        backtrack(nums,0);
        return vector<vector<int>>(res.begin(),res.end());
    }
};
相关推荐
We་ct5 天前
LeetCode 22. 括号生成:DFS回溯解法详解
前端·数据结构·算法·leetcode·typescript·深度优先·回溯
少许极端5 天前
算法奇妙屋(三十一)-递归、回溯与剪枝的综合问题 4
算法·剪枝·回溯·递归
We་ct6 天前
LeetCode 79. 单词搜索:DFS回溯解法详解
前端·算法·leetcode·typescript·深度优先·个人开发·回溯
闻缺陷则喜何志丹9 天前
【字典树 回溯】P7210 [COCI 2020/2021 #3] Vlak|普及+
c++·算法·字典树·回溯·洛谷
We་ct9 天前
LeetCode 46. 全排列:深度解析+代码拆解
前端·数据结构·算法·leetcode·typescript·深度优先·回溯
We་ct9 天前
LeetCode 39. 组合总和:DFS回溯解法详解
前端·算法·leetcode·typescript·深度优先·个人开发·回溯
ValhallaCoder1 个月前
hot100-回溯II
数据结构·python·算法·回溯
少许极端1 个月前
算法奇妙屋(二十九)-递归、回溯与剪枝的综合问题 2
算法·深度优先·剪枝·回溯·递归
I_LPL1 个月前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
老鼠只爱大米1 个月前
LeetCode经典算法面试题 #78:子集(回溯法、迭代法、动态规划等多种实现方案详细解析)
算法·leetcode·动态规划·回溯·位运算·子集