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

49 阅读1分钟

93.复原IP地址

78.子集

90.子集II

93. 复原IP地址

关键点:1.有效的子字符串的判断条件;2.终止条件里要包含当前字符串已全被切割的判断

var restoreIpAddresses = function(s) {
    const res = [];
    const backtrack = (arr, start) => {
        if (arr.length > 4) return;
        if (arr.length === 4 && start === s.length) {
            res.push([...arr].join('.'));
            return;
        }

        for (let i=start; i<s.length; i++) {
            const subStr = s.substring(start, i+1);
            if(subStr.length > 3 || +subStr > 255) break;
            if(subStr.length > 1 && subStr[0] === '0') break;

            arr.push(subStr);
            backtrack(arr, i+1);
            arr.pop();
        }
    }

    backtrack([], 0);
    return res;
};

78.子集

var subsets = function(nums) {
    const res = [];

    const backtrack = (arr, start) => {
        res.push([...arr]);
        if (start >= nums.length) {
            return;
        }

        for (let i=start; i<nums.length; i++) {
            arr.push(nums[i]);
            backtrack(arr, i+1);
            arr.pop();
        }
    }

    backtrack([], 0);
    return res;
};

90.子集II

don't forget 去重是基于排序的

var subsetsWithDup = function(nums) {
    const res = [];
    nums.sort((a,b)=>a-b);

    const backtrack = (arr, start) => {
        res.push([...arr]);

        for (let i=start; i<nums.length; i++) {
            if (i > start && nums[i] === nums[i-1]) continue;
            arr.push(nums[i]);
            backtrack(arr, i+1);
            arr.pop();
        }
    }

    backtrack([], 0);
    return res;
};