排列组合问题Java实现

上一篇博客写了怎样实现一个字符串的全排列,并且也给出了代码,在看这篇博客前先将上一篇博客搞懂,这篇看起来就很简单了。这篇将讲解一个从M个数中选取N(N<=M)个数的排列和组合,这里先说明一下,M个数中选取N个数的组合就是将对应的排列去重(比如ab,ba是两个排列,但是却是一个组合)。

上一篇通过分治的方法求得了全排列,非全排列也是通过分治的方法得到,下面一个图是从abcd四个数中选取2个数的组合的过程,希望通过下图可以帮助你更好地理解。

说明一下上图:N=2表示是从四个数中选取两个2数出来排列,Loc=0表示还未开始组合,当Loc=1时,表示第一位(第Loc位)和它自己及后面的字符交换,交换后变成四个字符串,Loc=Loc+1;继续往后,在已经有的基础上,四个字符串的第二位(第Loc位)字符与他自己及后面的字符串进行交换,如此反复进行,直到Loc=N时停止,输出每一个字符串的前N位,就是排列的结果。下面是代码

package Permutation;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
 
public class Permutation {
 
	public static HashSet<String> combination=new HashSet<>();
	public static List<String> permutation=new ArrayList<>();
	//求全排列
	public static void generatePermutation(char str[],int start)
	{
		if(start<str.length)
		{
			for(int i=start;i<str.length;i++)
			{
				char temp[]=new char[str.length];
				for(int j=0;j<str.length;j++)
					temp[j]=str[j];				
				//交换第start个元素与第i个元素
				char charStart=temp[start];
				char charend=temp[i];
				temp[start]=charend;
				temp[i]=charStart;
				
				if(start==str.length-1)
				{	
					//只有最有一个元素时,打印字符
					printCharArray(temp);
				}				
				generatePermutation(temp, start+1);
			}
			
		}
	}
	//从M个数中取出N个数的排列
	public static void NM_Permutation(char data[],int location,int N)
	{
		if(N>data.length)
			return;
		if(location<N)
		{
			for(int i=location;i<data.length;i++)
			{
				char temp[]=new char[data.length];
				for(int j=0;j<data.length;j++)
					temp[j]=data[j];	
				char loc=temp[location];
				temp[location]=temp[i];
				temp[i]=loc;
				if(location==N-1)
				{
					String result=printCharArray(temp,N);
					permutation.add(result);
				}
				NM_Permutation(temp,location+1,N);
			}
		}
	}
	//计算组合
	public static void Combination(char chars[],int N)
	{
		permutation.clear();
		combination.clear();
		
		System.out.println("************排列结果******************");
		System.out.println("************************************");
		//计算排列
		NM_Permutation(chars, 0, N);
		for(int i=0;i<permutation.size();i++)
		{
			String resultSort=getSortArr(permutation.get(i));
			combination.add(resultSort);
			System.out.println(resultSort);
		}
		System.out.println();
		System.out.println("************组合结果******************");
		System.out.println("************************************");
		Iterator data=combination.iterator();
		while(data.hasNext())
		{
			System.out.println(data.next());
		}
		
	}
	
	public static void printCharArray(char chars[])
	{
		StringBuffer str=new StringBuffer();
		for(int i=0;i<chars.length;i++)
		{
			str.append(chars[i]);
		}
		System.out.println(str.toString());
	}
	public static String printCharArray(char chars[],int N)
	{
		StringBuffer str=new StringBuffer();
		for(int i=0;i<N;i++)
		{
			str.append(chars[i]);
		}		
		System.out.println(str.toString());
		return str.toString();
	}
	public static String getSortArr(String str)
	{
		char datas[]=str.toCharArray();
		Arrays.sort(datas);
		StringBuffer result=new StringBuffer();
		for(int i=0;i<datas.length;i++)
			result.append(datas[i]);
		return result.toString();
	}
	public static void main(String[] args) {
		char test[]={'a','b','c','d','e'};
		generatePermutation(test,0);	
		System.out.println("--------------------");
		Combination(test,2);			
	}
}

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值