全排列 与m中挑出n个数

生成全排列的方法在网上有好多种,m中选出n个数的方法也有很多,多数是采用递归的方式,但实际上这两种问题都可以归结为同一个问题:m个数中可能出现的所有可能数。例如:1 ,2可以出现的所有数有:1,2,12,21

对所有可能出现的数的长度加以限制就可以变成生成全排列的问题或者m中选出n个数的排列组合问题


java的实现代码如下:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class test {
	static int limitMin;
	static int limitMax;//挑出长度小于等于max且大于min的字符串排列组合
	static void func(List mylist,String prefix)
	{
		if(prefix.length()>=limitMin&&prefix.length()<=limitMax)
		System.out.println(prefix);//只有满足长度要求才输出,
		
		for(int i=0;i<mylist.size();i++)
		{
			List temp=new LinkedList (mylist);//
			func(temp,prefix+temp.remove(i));//将第i个数加到已处理的字符串后
		}
	}
//……MAIN函数在此
}


在main函数中设定limitMax和LimitMin的值,设定为总长度就为全排列问题

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String []arry={"1","2","3","4","5"};
		limitMin=5;//限制最小长度
		limitMax=5;//限制最大长度
		func(Arrays.asList(arry),"");
	}

运行结果:



设定为全为3,则为5个数中选出3个数的排列组合问题

limitMax=3;

limitMin=3;

 运行结果:
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值