几种常见的排列组合

1、排列组合(子串不重复)-组成字符串

function combination(arr, index = 0, group = []) {
    let temporaryArr = [];
    temporaryArr.push(arr[index]);
    for (let i = 0; i < group.length; i++) {
        temporaryArr.push(group[i] + arr[index]);
    }
    group = group.concat(temporaryArr)

    if (index + 1 >= arr.length) {
        return group;
    }
    return combination(arr, index + 1, group);
}
console.log(combination(['a', 'b', 'c', 'd']));

结果

2、排列组合(单个子串不重复)-组成数组

// 排列组合(子串不重复)-组成数组
function combination2(arr, index = 0, group = []) {
    let temporaryArr = [];
    temporaryArr.push([arr[index]]);
    for (let i = 0; i < group.length; i++) {
        if (Array.isArray(group[i])) {
            temporaryArr.push([...group[i], arr[index]])
        } else {
            temporaryArr.push([group[i], arr[index]])
        }
    }
    group = group.concat(temporaryArr)

    if (index + 1 >= arr.length) {
        return group;
    }
    return combination2(arr, index + 1, group);
}

console.log(combination2(['a', 'b', 'c', 'd']));

结果

3、全排列组合,每个组合所有元素都参与

// 全排列组合,每个组合所有元素都参与
function combination3(arr) {
    let res = []
    function fn(temporaryArr, leftArr) {
        if (temporaryArr.length === arr.length) {
            res.push(temporaryArr)
        } else {
            for (let i = 0; i < leftArr.length; i++) {
                let temp = [...leftArr]
                temp.splice(i, 1)
                // 循环每次将当前这个 与 除了当前这个进行递归组合
                fn(temporaryArr.concat(leftArr[i]), temp)
            }
        }
    }
    fn([], arr)
    return res
}
console.log(combination3(['a', 'b', 'c', 'd']))

结果

4、一对多,单向全组合

// 单向全组合
function combination4(arr){
    let lengthArr = [];
    let productArr = [];
    let result = [];
    let length = 1;
    for(let i = 0; i < arr.length; i++){
        let len = arr[i].length;
        lengthArr.push(len);
        productArr.push(i === 0 ? 1 : arr[i - 1].length * productArr[i - 1]);
        length *= len;
    }
    for(let i = 0; i < length; i++){
        let resultItem = [];
        for(let j = 0; j < arr.length ; j ++){
            resultItem.push(arr[j][Math.floor(i / productArr[j]) % lengthArr[j]]);
        }
        result.push(resultItem);
    }
    return result
}
console.log(combination4([['a','b','c'],['1','2','3'],['X','Y']]));

结果

https://web03.cn/blog/249

posted @ 2021-05-20 15:49  小林不会飞  阅读(1081)  评论(0编辑  收藏  举报