zoukankan      html  css  js  c++  java
  • 几种常见的排列组合

    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

    踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。
  • 相关阅读:
    GPU CUDA之——深入理解threadIdx
    需求分析、业务逻辑与数据结构
    软件建模的本质
    浅谈软件需求建模
    软件建模即程序设计
    软件开发从0到1与软件建模
    数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。
    观察力与信息搜集能力
    人类为什么写书
    鲁宾斯坦说:"思维是在概括中完成的。"
  • 原文地址:https://www.cnblogs.com/xiaofeilin/p/14790113.html
Copyright © 2011-2022 走看看