程式碼隨想錄演算法訓練營第27天 | 39. 組合總和 、 40.組合總和II 、 131.分割回文串

YuanYF6發表於2024-06-03
  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;
};

相關文章