代码随想录算法训练营Day28 | 93.复原IP地址,78.子集,90.子集II

93.复原IP地址

本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了

题目链接/文章讲解
视频讲解

题目

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

思路

类似于切割回文串,按照切割的想法去做。

答案

/**
 * @param {string} s
 * @return {string[]}
 */
var restoreIpAddresses = function(s) {
    const res = [], path = [];
    let str = '';
    const isValid = function(str) {
        if (str.length > 1 && str[0] === '0') return false;
        if (Number(str) >= 0 && Number(str) <= 255) return true;
        return false;
    }
    const backtracking = function(startIndex) {
        if(startIndex >= s.length && path.length === 4) {
            res.push(path.join('.'));
            return;
        }
        if(path.length >= 4) return;
        for(let i = startIndex; i < s.length; i++) {
            str = s.substring(startIndex, i+1);
            // 判断是否合法
            if(!isValid(str)) continue;
            path.push(str);
            backtracking(i+1);
            path.pop();
        }
    }

    backtracking(0);
    return res;
};

78.子集

子集问题,就是收集树形结构中,每一个节点的结果。 整体代码其实和 回溯模板都是差不多的。

题目链接/文章讲解
视频讲解

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

答案

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    const res = [], path = [];
    const backtracking = function(startIndex) {
        res.push([...path]);
        if(startIndex >= nums.length) {
            return;
        }
        for(let i = startIndex; i < nums.length; i++) {
            path.push(nums[i]);
            backtracking(i+1);
            path.pop();
        }
    }
    backtracking(0);
    return res;
};

90.子集II

大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。

题目链接/文章讲解
视频讲解

题目

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

答案

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsetsWithDup = function(nums) {
    nums.sort((a, b) => a-b);
    const res = [], path = [];
    const backtracking = function(startIndex) {
        res.push([...path]);
        if (path.length > nums.length) return;
        for(let i = startIndex; i < nums.length; i++) {
            // 要注意这里判断去重,在同一层不能使用相同的数字
            if(nums[i] === nums[i-1] && i > startIndex) continue;
            path.push(nums[i]);
            backtracking(i+1);
            path.pop();
        }
    }
    backtracking(0);
    return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值