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

    踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。
  • 相关阅读:
    mongodb导入导出
    python笔记1
    C# 文件下载断点续传
    热水维修记事
    memcached笔记
    模拟登陆
    Nginx学习笔记之加强篇
    Redis学习笔记之基础篇
    Nginx学习笔记之应用篇
    Nginx 学习笔记之安装篇
  • 原文地址:https://www.cnblogs.com/xiaofeilin/p/14790113.html
Copyright © 2011-2022 走看看