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;
}
}
给点分呗 -.-
|