求若干字符的排列,不能包含相同字符

import java.util.HashSet;

public class CharsToStrings {

public static void generateString(char[] charArray) {

}
/**
* @param args
*/
public static void main(String[] args) {
char[] charArray = new char[]{'a', 'b', 'c', 'd'};
StringBuffer strBuf = new StringBuffer(3);
int number = 0;

// 循环方式
for (int i = 0; i < charArray.length; i++) {
strBuf.delete(0, strBuf.length());
strBuf.append(charArray[i]);
for (int j = 0; j < charArray.length; j++) {
if (j == i)
continue;
strBuf.delete(1, strBuf.length());
strBuf.append(charArray[j]);
for (int k = 0; k < charArray.length; k++) {
if (k == j || k == i)
continue;
strBuf.delete(2, strBuf.length());
strBuf.append(charArray[k]);
for (int p = 0; p < charArray.length; p++) {
if (p == k || p == j || p == i)
continue;
strBuf.delete(3, strBuf.length());
strBuf.append(charArray[p]);
System.out.println(strBuf.toString());
number++;
}

}
}
}
System.out
.println(number
+ "\n---------------------------------------------------------------------");
// 数学计数方式
number = 0;
long count = 1;
for (int i = 0; i < charArray.length; i++) {
count *= charArray.length;
}
StringBuffer charBuf = new StringBuffer(3);
HashSet<Integer> remainderSet = new HashSet<Integer>(3);
// System.out.println(count);
for (long i = 0; i < count; i++) {
charBuf.delete(0, charBuf.length());
remainderSet.clear();
long dividend = i;
int n = charArray.length;
while (n-- >= 0) {
int remainder = (int) (dividend % charArray.length);
if (remainderSet.contains(remainder)) {
break;
} else {
remainderSet.add(remainder);
charBuf.append(charArray[remainder]);
dividend /= charArray.length;
}
}
if (n < 0) {
charBuf.reverse();
System.out.println(i + ": " + charBuf.toString());
number++;
}

}
System.out
.println(number
+ "\n---------------------------------------------------------------------");

}
}


输出:
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
24
---------------------------------------------------------------------
27: abcd
30: abdc
39: acbd
45: acdb
54: adbc
57: adcb
75: bacd
78: badc
99: bcad
108: bcda
114: bdac
120: bdca
135: cabd
141: cadb
147: cbad
156: cbda
177: cdab
180: cdba
198: dabc
201: dacb
210: dbac
216: dbca
225: dcab
228: dcba
24
---------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值