| import java.util.Enumeration; import java.util.Stack;
 
 public class Test7 {
 static String[][] stringss;
 static String[] strings;
 static int index;
 
 public static void main(String[] args){
 String stringsmain = "abcd";
 char[] chars = stringsmain.toCharArray();   //将字符串stringsmain转换成一个数组
 stringss = new String[chars.length][];
 combiantion(chars);   //调用combination方法,找到组合,并存储在string[][]中
 for(int indexout=0; indexout<stringss.length; indexout++){   //遍历stringss[][]数组
 for(int indexin=0; indexin<stringss[indexout].length; indexin++){
 char[] arr = stringss[indexout][indexin].toCharArray();
 permutation(arr, 0, arr.length);   //将组合传入permutation方法,并进行全排列
 }
 System.out.println();
 }
 }
 
 public static void combiantion(char[] chs){   //该方法用于求解字符串的全部组合
 if(chs.length == 0)
 return;
 Stack<Character> stack = new Stack<Character>();
 for(int i = 1; i <= chs.length; i++){
 int num = factorial(chs.length)/(factorial(i)*factorial(chs.length-i));
 //求出不同字符串,不同长度下的组合的数量num
 strings= new String[num];
 index = 0;
 //调用combine方法,求该字符串长度为i时的组合情况,并将数据保存到strings数组中
 combine(chs, 0, i, stack);
 stringss[i-1] = strings;
 }
 }
 
 public static int factorial(int num){   //定义num的阶乘
 int result = 1;
 for(;num>=1;num--){
 result *=num;
 }
 return result;
 }
 //该方法用于求解字符串在长度为number时的组合情况,主要利用了递归思想
 public static void combine(char[] chars, int begin, int line, Stack<Character> stack){
 //定义跳出递归的条件
 if(line == 0){
 Enumeration<Character> enumer = stack.elements();
 strings[index] = "";
 while(enumer.hasMoreElements()){
 strings[index] += enumer.nextElement().toString();
 }
 index++;
 return;
 }
 if(begin == chars.length){
 return;
 }
 stack.push(chars[begin]);//利用堆栈缓存数据
 combine(chars, begin+1, line-1, stack);
 stack.pop();
 combine(chars, begin+1, line, stack);
 }
 //用于对字符数组进行全排列
 public static void permutation(char[] arr, int index, int size){
 //递归的出口,并用于输出当前排列
 if (index+1 == size){
 System.out.print("\"");
 for (int i = 0; i < arr.length; i++){
 System.out.print(arr[i] + "");
 }
 System.out.print("\"\t");
 }
 else {
 for (int i = index; i < size; i++) {
 //如果arr[i]和arr[index]相同则不进行操作,避免了存在相同元素时的重复排序,但由于组合的方法没有对相同字符加以辨别,所以最终效果并不好
 if(i != index && arr[i] == arr[index])
 continue;
 swap(arr, i, index);//如果不相同则交换两元素
 permutation(arr, index+1, size);//进入下一层,下一层会对后面的元素进行排序或者打印出当前的排列
 swap(arr, i, index);//再次换回交换前的状态,以便为下一个排列做准备
 }
 }
 }
 //用于交换数组元素的方法
 public static void swap(char[] arr, int idx1, int idx2) {
 char temp = arr[idx1];
 arr[idx1] = arr[idx2];
 arr[idx2] = temp;
 }
 }
 给点分呗 -.-
 
 
 |