上一篇博客写了怎样实现一个字符串的全排列,并且也给出了代码,在看这篇博客前先将上一篇博客搞懂,这篇看起来就很简单了。这篇将讲解一个从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);
}
}