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

一、93 复原IP地址

  1. 题目链接:https://leetcode.cn/problems/restore-ip-addresses/

  1. 思路:总体思路和切割一样,但是需要注意的是得判断是否有01这样的不合法ip码出现。

  1. 代码:

var restoreIpAddresses = function(s) {
    var result = [];
    var backtracking = function(startIndex, path) {
        if (startIndex >= s.length && path.length == 4) {
            result.push(path.join('.'));
            return;
        }
        for (let i=startIndex; i 1) {
                continue;
            }
            else if (parseInt(ip) >= 0 && parseInt(ip) <= 255) {
                path.push(ip);
            }
            else {
                continue;
            }
            backtracking(i + 1, path);
            path.pop();
        }
    }
    backtracking(0, []);
    return result;
};

二、78 子集

  1. 题目链接:https://leetcode.cn/problems/subsets/

  1. 思路:子集问题是收集树上所有节点的过程,而分割问题和组合问题是收集树的所有叶子节点的过程,这个时候就需要在终止条件上进行修改,原来是判断它到了叶子节点,现在不用判断,直接push。

  1. 代码:

var subsets = function(nums) {
    var result = [];
    var backtracking = function(startIndex, path) {
        // 因为要收集树的所有节点,因此每一次递归都要push
        result.push(path.slice(0));
        if (startIndex >= nums.length) {
            return;
        }
        for (let i = startIndex; i

三、子集

  1. 题目链接:https://leetcode.cn/problems/subsets-ii/

  1. 思路:总体思路和子集几乎一样,但是要和40.求组合III一样,进行去重。

  1. 代码:

var subsetsWithDup = function(nums) {
    var result = [];
    nums.sort((a, b) => a - b);
    var backtracking = function(startIndex, path) {
        result.push(path.slice(0));
        if (startIndex >= nums.length) {
            return;
        }
        for (let i=startIndex; i startIndex && nums[i] == nums[i - 1]) {
                continue;
            }
            path.push(nums[i]);
            backtracking(i + 1, path);
            path.pop();
        }
    }
    backtracking(0, []);
    return result;
};

今日学习时长:1h左右

总结:今天的几道题相对比较简单,不过不知道如果长时间不练习这些会不会就想不明白回溯咋做了。。。

你可能感兴趣的:(算法训练营,javascript,算法,数据结构,leetcode)