前端算法系列-回溯02

55 阅读1分钟

39. 组合总和

var combinationSum = function(candidates, target) {
    let res = []
    let path = []
    let fn = (target,index,sum) => {
        if(sum > target) return 
        if(sum === target){
            res.push([...path])
            return
        }
        for(let i=index;i<candidates.length;i++){
            path.push(candidates[i])
            sum += candidates[i]
            fn(target,i,sum)
            path.pop()
            sum -= candidates[i]
        }
    }
    fn(target,0,0)
    return res
};

剪枝操作

for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)

40. 组合总和 II

var combinationSum2 = function(candidates, target) {
    const res = []; path = [], len = candidates.length;
    candidates.sort((a,b)=>a-b);
    backtracking(0, 0);
    return res;
    function backtracking(sum, i) {
        if (sum === target) {
            res.push(Array.from(path));
            return;
        }
        for(let j = i; j < len; j++) {
            const n = candidates[j];
            if(j > i && candidates[j] === candidates[j-1]){
              //若当前元素和前一个元素相等
              //则本次循环结束,防止出现重复组合
              continue;
            }
            //如果当前元素值大于目标值-总和的值
            //由于数组已排序,那么该元素之后的元素必定不满足条件
            //直接终止当前层的递归
            if(n > target - sum) break;
            path.push(n);
            sum += n;
            backtracking(sum, j + 1);
            path.pop();
            sum -= n;
        }
    }
};

131. 分割回文串

var isHunWen = (s,l,r) => {
    for (let i = l, j = r; i < j; i++, j--) {
        if(s[i] !== s[j]) return false;
    }
    return true;
}

var partition = function(s) {
    let result = []
    let path = []
    let fn = (index,s) => {
        if(index >= s.length){
            result.push([...path])
            return  
        }
        for(let i=index;i<s.length;i++){
            if(isHunWen(s,index,i)){
                path.push(s.slice(index,i+1))
            }else{
                continue
            }
            fn(i+1,s)
            path.pop()
        }
    }
    fn(0,s)
    return result
};