package com.itheima;
/**
* 8、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
*
*
*
* 原始字符串是"abc",打印得到下列所有组合情况:
* "a" "b" "c"
* "ab" "bc" "ca" "ba" "cb" "ac"
* "abc" "acb" "bac" "bca" "cab" "cba"
* @author mars
*/
public class Test8
{
public static void main(String[] args)
{
String str = "abc";//定义指定数组
myCombinationAanRange(str);
System.out.println("共有"+num+"个");//输出共有多个数。
}
public static void myCombinationAanRange(String str)
{
char[] ch = new char[1024];
int n = str.length();//元素个数。
//求出位图全组合的结果个数:2^n
int nbit = 1<<n; // “<<” 表示 左移:各二进位全部左移若干位,高位丢弃,低位补0。:即求出2^n=2Bit。
int x = 0;//临时c数组下标变量
for(int i=0; i<nbit; i++)//结果有nbit个。输出结果从数字小到大输出:即输出0,1,2,3,....2^n。
{
for(int j=0; j<n ; j++)//每个数二进制最多可以左移n次,即遍历完所有可能的变化新二进制数值了
{
if ((i & (1 << j)) != 0)//& 表示与。两个位都为1时,结果才为1
{
ch[x++] = str.charAt(j);//放入c数组中。
}
}
allPerm(ch,0,x-1);//全排列
x = 0;//数组下标归0
}
}
private static int num = 0;//计全排列个数
//全排列
public static void allPerm(char[] arr , int start,int end)
{
//输出arr[start..end]的所有排列方式
if(start == end)
{
//输出一个排列方式
for(int j=0; j<= end ;j++)
{
System.out.print(arr[j]);
}
System.out.println();
num++;
}
for(int i = start; i <= end ; i++)
{
swap(arr, i, start);
allPerm(arr, start+1, end); //固定好当前一位,继续排列后面的
swap(arr, i, start);
}
}
//交换
private static void swap(char[] arr, int start, int i)
{
char tmp = arr[start];
arr[start] = arr[i];
arr[i] = tmp;
}
}
|
|