代码随想录算法训练营第二十六天 | 39.组合总和、40.组合总和II、131.分割回文串

57 阅读1分钟

39.组合总和

40.组合总和II

131.分割回文串

39. 组合总和

var combinationSum = function(candidates, target) {
    const res = [];

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

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

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

// 更进一步优化:排序后直接缩减循环大小
var combinationSum = function(candidates, target) {
    const res = [];
    candidates.sort((a,b) => a-b);

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

        for (let i=start; i<candidates.length && sum + candidates[i] <= target; i++) {
            sum += candidates[i];
            arr.push(candidates[i]);
            backtrack(arr, sum, i);
            sum -= candidates[i];
            arr.pop();
        }
    }

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

40.组合总和II

var combinationSum2 = function(candidates, target) {
    candidates.sort((a,b) => a-b);
    const res = [];
    const used = new Array(candidates.length).fill(false);

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

        for (let i=start; i<candidates.length && sum + candidates[i] <= target; i++) {
            // i > startIndex && candidates[i] == candidates[i - 1]
            if (i>0 && candidates[i] === candidates[i-1] && used[i-1] === false ) {
                continue;
            }
            sum += candidates[i];
            arr.push(candidates[i]);
            used[i] = true;
            backtrack(arr, sum, i+1);
            used[i] = false;
            sum -= candidates[i];
            arr.pop();
        }
    }

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

131.分割回文串

var partition = function(s) {
    const res = [];

    const isValid = (start, end) => {
        if (start === end)  return true;
        let i=start, j=end;
        while (i<j) {
            if (s[i] !== s[j]) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

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

        for (let i=start; i<s.length; i++) {
            if (isValid(start, i)) {
                arr.push(s.substring(start, i+1));
            } else {
                continue;
            }
            backtrack(arr, i + 1);
            arr.pop();
        }
    }

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