1.排列
如abc的排列,输出abc,acb,bac,bca,cab,cba
public ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<String>();
int len = str.length();
if(str == null || len == 0){
return list;
}
char[] chars = str.toCharArray();
Permutation(chars,0,list);
Collections.sort(list);
return list;
}
public void Permutation(char[] chars,int beginIndex,ArrayList<String> list){
if(beginIndex == chars.length ){
list.add(new String(chars));
return;
}
HashSet<Character> set = new HashSet<Character>();
for(int i=beginIndex;i<chars.length;i++){
if(!set.contains(chars[i])){
set.add(chars[i]);
swap(chars,beginIndex,i);
Permutation(chars,beginIndex+1,list);
swap(chars,beginIndex,i);
}
}
return;
}
2.组合
组合是类似将abc分为abc、ab、bc、a、b、c这样的形式,输出元素数量从原本元素数n开始递减至1的排列。
分为两种情况:
1.第一个元素在组合中,则在n-1个元素中找m-1个
2.第一个元素不在组合中,则在n-1个元素中找m个
public static void combine(char chs[]){
if(chs.length == 0) return ;
Stack<Character> stack = new Stack<Character>();
for(int i = 1; i <= chs.length; i++){
combine(chs, 0, i, stack);
}
}
//从字符数组中第begin个字符开始挑选number个字符加入stack中
public static void combine(char []chs, int begin, int number, Stack<Character> stack){
if(number == 0){
System.out.println(stack.toString());
return ;
}
if(begin == chs.length){
return;
}
stack.push(chs[begin]);
combine(chs, begin + 1, number - 1, stack);
stack.pop();
combine(chs, begin + 1, number, stack);
}