题目:
求解n个元素的组成的大小为m的组合
思路:
假设我们想在长度为n的字符串中求m个字符的组合。
我们先从头扫描字符串的第一个字符。
针对第一个字符,我们有两种选择:
一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;
二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。
思路讲完了,直接上代码:
public static void combination(char chs[]){
if(chs==null||chs.length==0){
return ;
}
List<Character> list=new ArrayList();
for(int i=1;i<=chs.length;i++){//算出不同长度的组合
combine(chs,0,i,list);
}
}
//从字符数组中第begin个字符开始挑选number个字符加入list中
public static void combine(char []cs,int begin,int number,List<Character> list){
if(number==0){
System.out.println(list.toString());
return ;
}
if(begin==cs.length){
return;
}
//对应第一种选择:将当前元素加入组合,然后在剩下的n-1个元素中找m-1个元素
list.add(cs[begin]);
combine(cs,begin+1,number-1,list);
//注意,这里退出上面的递归调用之后要将当前已经加入的元素移除,
//以免影响第二种选择的递归
list.remove((Character)cs[begin]);
//对应第二种选择:当前元素不加入组合,然后在剩下的n个元素中找m-1个元素
combine(cs,begin+1,number,list);
}
public static void main(String args[]){
char chs[]={'a','b','c'};
combination(chs);
}