字符串的排列组合
abc的排列是如下情况
abc
acb
bac
bca
cba
cab
如果出现了aab这种情况求全排列就只需要用定义set去调重复就可以,当然如果组合出现了aab求组合也是只需要定义一个set就可以
public class RecursionTree {
public static void permutation(char[] s,int from,int to) {
if(to <= 1)
return;
if(from == to) {
System.out.println(s);
} else {
for(int i=from; i<=to; i++) {
swap(s,i,from); //交换前缀,使其产生下一个前缀
permutation(s, from+1, to);
swap(s,from,i); //将前缀换回,继续做上一个前缀的排列
}
}
}
public static void swap(char[] s,int i,int j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
public static void main(String[] args) {
char[] s = {'a','b','c','d','e'};
permutation(s, 0, 2);
}
}
abc的组合情况是如下情况
[a]
[b]
[c]
[a, b]
[a, c]
[b, c]
[a, b, c]
import java.util.ArrayList;
import java.util.List;
public class Combination {
public static void combiantion(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;
}
list.add(cs[begin]);
combine(cs,begin+1,number-1,list);
list.remove((Character)cs[begin]);
combine(cs,begin+1,number,list);
}
public static void main(String args[]){
char chs[]={'a','b','c'};
combiantion(chs);
}
}