文档章节

数组排列组合

WangPerry
 WangPerry
发布于 2014/11/21 18:35
字数 237
阅读 25
收藏 0
public class Test {

    public static void main(String[] args) {
        String[][] dataArray = {{"zhong","chong"},{"qing"},{"hai","huan"},{"ri"}};
        combine(dataArray, 4);
    }
    public static void combine(String[][] data, int n){
        if (n > data.length) {n = data.length;}
        int[] idx = new int[data.length];
        for (int i=0; i<data.length; i++) {
            if (i<data.length-n) {idx[i]=0;}
            else {idx[i]=1;}
        }
        List<String> list = new ArrayList<>();
        while (idx[0] < 2) {
            int cnt=0, dig=0;
            int[] gp = new int[n];
            for (int i=0; i<idx.length; i++) {
                if (idx[i] == 1) {
                    if (i<n) {dig++;}
                    if (cnt<n) {gp[cnt] = i;}
                    cnt++;
                }
            }
            if (n == cnt) {
                int[] subIdx = new int[n];
                Arrays.fill(subIdx, 0);
                while (subIdx[0] < data[gp[0]].length) {
                    StringBuilder sb = new StringBuilder();
                    for (int i=0; i<n; i++) {
                        sb.append(data[gp[i]][data[gp[i]].length-subIdx[i]-1]);
                    }
                    list.add(0, sb.toString());

                    subIdx[n-1]++;
                    for (int i=n-1; i>0; i--) {
                        if (subIdx[i] == data[gp[i]].length) {
                            subIdx[i] = 0;
                            subIdx[i-1]++;
                        } else {
                            break;
                        }
                    }
                }
            }
            if (dig == n) {break;}

            idx[data.length-1]++;
            for (int i=data.length-1; i>0; i--) {
                if (idx[i] == 2) {
                    idx[i] = 0;
                    idx[i-1]++;
                } else {
                    break;
                }
            }

        }

        int count = 0;
        for (String s : list) {
            System.out.printf("%s", s);
            System.out.println();
            count++;
            if (count%10 == 0) {System.out.println();}
        }
        System.out.printf("\ncount=%d\n", count);
    }
}

运行结果:

zhongqinghairi

zhongqinghuanri

chongqinghairi

chongqinghuanri

count=4


© 著作权归作者所有

共有 人打赏支持
WangPerry

WangPerry

粉丝 10
博文 17
码字总数 9551
作品 0
深圳
架构师
程序员必备算法——排列组合

程序员必备算法——排列组合 [TOC] 还记得排列组合吗? 在高中的时候最常接触的莫过于排列组合了,毕竟高考必考的嘛。我们先来回忆下这两个的公式是啥: 如果看到这个还有一丢丢的印象,说明...

窗边的扁豆
2017/10/07
0
0
PostgreSQL 遗传学应用 - 矩阵相似距离计算 (欧式距离,...XX距离)

标签 PostgreSQL , 背景 生物科学中相当重要的工作之一解开遗传密码? 欧式空间计算,是其中的一个需求,很有意思吧,PostgreSQL可以用来解开遗传密码。 https://en.wikipedia.org/wiki/Eucl...

德哥
2017/12/27
0
0
next_permutation(全排列算法)

STL提供了两个用来计算排列组合关系的算法,分别是nextpermutation和prevpermutation。首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑三个字符所组成的序列{a,...

angel_kitty
2017/02/12
0
0
【递归】阶乘、全排列 、组合、二分查找

递归(recursion):程序调用自身的编程技巧。 递归满足2个条件: 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 最简单的例子是阶乘 全排列 从n个不同元素中任...

SibylY
2016/07/03
32
0
47. Permutations II

使用递归算法特性:必须的终止条件子问题比原来的问题小子问题可以再递归求解子问题的解能够组成大问题的解 a bc b ac c ba

datacube
2016/07/05
5
0

没有更多内容

加载失败,请刷新页面

加载更多

python做文本内容指定区域字符串替换

需求: 因为公司项目需要做SEO优化,所以对项目中的各种长连接做优化,比如本文中提到的精简路径;之前已经批量吧文本的路径名字等做过修改,这里不再赘述;这里的问题是外部的路径修改了,文...

坦途abc
11分钟前
0
0
MySQL 关键字模糊匹配,并按照匹配度排序

MySQL 关键字模糊匹配,并按照匹配度排序。 方式一、按照关键字搜索,然后根据关键字所占比例排序 SELECTdrug_name,pinyinFROMtbl_drugWHEREpinyin LIKE '%AM%'ORDER BY...

yh32
21分钟前
0
0
虚拟机学习之一:java内存区域与内存溢出异常

1.运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途和创建、销毁时间,有的区域伴随虚拟机进程的启动而存在,有些区...

贾峰uk
22分钟前
0
0
Spring加载properties文件的两种方式

在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修...

架构师springboot
38分钟前
0
0
分布式事务,原来可以这么玩?

多个数据要同时操作,如何保证数据的完整性,以及一致性? 答 : 事务 ,是常见的做法。 举个栗子: 用户下了一个订单,需要修改 余额表 , 订单 表 , 流水 表 ,于是会有类似的伪代码: st...

微笑向暖wx
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部