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

  1. 组合总和

本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制
题目链接/文章讲解:https://programmercarl.com/0039.组合总和.html
视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum = function(candidates, target) {
    candidates.sort((a,b)=>a-b);
    const res = [];
    const path = [];
    let sum = 0;
    let len = candidates.length;
    const backtracking = (startIndex) => {
        if (sum === target) {
            res.push([...path]);
            return;
        }

        for (let i=startIndex;i<len;i++) {
            sum += candidates[i];
            path.push(candidates[i]);
            if (sum > target) {
                sum -= candidates[i];
                path.pop();
                return;
            }
            backtracking(i);
            sum -= candidates[i];
            path.pop();
        }
    }
    backtracking(0);
    return res;
};

40.组合总和II

本题开始涉及到一个问题了:去重。
注意题目中给我们 集合是有重复元素的,那么求出来的 组合有可能重复,但题目要求不能有重复组合。
题目链接/文章讲解:https://programmercarl.com/0040.组合总和II.html
视频讲解:https://www.bilibili.com/video/BV12V4y1V73A

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum2 = function(candidates, target) {
    candidates.sort((a,b)=>a-b);
    let len = candidates.length;
    const res = [];
    const set = new Set();
    const path = [];
    const backtracking = (startIndex, sum) =>{
        if (sum === target) {
            res.push([...path]);
            return;
        }
        for (let i=startIndex; i< len;i++) {
            if (i>startIndex && candidates[i] === candidates[i-1]) {
                continue;
            }
            let item = candidates[i];
            sum += item;
            if (sum > target) {
                sum -= item;
                return;
            }
            path.push(item);
            backtracking(i+1,sum);
            path.pop();
            sum -= item;
        }
    }
    backtracking(0,0);
    return res;
};

131.分割回文串

本题较难,大家先看视频来理解 分割问题,明天还会有一道分割问题,先打打基础。
https://programmercarl.com/0131.分割回文串.html
视频讲解:https://www.bilibili.com/video/BV1c54y1e7k6

function isPalindrome(s, start, end) {
    for (let i=start,j=end;i<=end;i++) {
        if (s[i]!==s[j]) {
            return false;
        }
        j--;
    }
    return true;
}

/**
 * @param {string} s
 * @return {string[][]}
 */
var partition = function(s) {
    let res = [];
    let path = [];
    const backtraversing = (str,startIndex)=>{
        if (str.length<=startIndex){
            res.push([...path]);
            return;
        }

        for (let i=startIndex;i<str.length;i++) {
            if (isPalindrome(str,startIndex,i)) {
                path.push(str.slice(startIndex,i+1));
                backtraversing(str,i+1);
                path.pop();
            } else {
                continue;
            }
        }
    }
    backtraversing(s,0);
    return res;
};
posted @ 2024-06-03 23:49  YuanYF6  阅读(3)  评论(0编辑  收藏  举报