2010年12月06日 星期一 10:01
如“abc”输出结果为:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”
6 S1 F! b( Z. T* a& q
public class AllCombString {
6 g j8 ^8 a' |& V. A5 z
public static int t;//组合个数
public static void main(String[] args) {
# E9 x' `. ?2 @; T
String str = "123";
- n4 |# V% [7 p: N" b
char[] c = str.toCharArray();
' b( ^% Z: ^ E4 N) v
println(c)
t++;
/ S0 @* x2 P5 j. X k
allCombString(c,0);
% |% `+ e# W m& [$ ]4 }2 s' n2 ]
System.out.println(t);
}
2 |" _5 C2 l+ j! Y, R7 f
public static void allCombString(char[] c,int s){
int l = c.length;
if(l-s==2){
char temp = c[l-1];
- P- t4 G" @0 I) S4 A! ?$ |
c[l-1] = c[l-2];
c[l-2] = temp;
, T% O5 U) E* V9 S
println(c);
* x' R+ z2 S; z& u: d$ q8 y% p% [
t++;
( v* p+ P# ]" [. \
}
% ~4 c I. s' j4 F
else{
- e+ A9 O! P& ~
for(int i=s;i<l;i++){
moveToHead(c,i,s);
4 _. X, i+ T7 I) V
char ct[] = new char[l];
^. z% f. M9 G( o6 z& G- D
System.arraycopy(c, 0, ct, 0, l);//保持其他元素位置不变
" m/ {6 k4 s1 }" V
allCombString(ct,s+1);
7 ~$ s/ e& u* X3 ~# T1 c8 g' G
}
}
}
$ X" k! Z/ b6 j4 v, Q. w8 Z* D- q5 n
public static void moveToHead(char[] c,int id,int s){
( m6 ~' `+ V; J" i0 _9 O
if(id>s&&id<c.length){
% U6 f; i) Z0 c0 V
char temp = c[id];
for(int i=id;i>s;i--){
! K( k" c7 f, n" B; a! ] w
c[i] = c[i-1];
& X( ]: Q( R* r$ F
}
+ ~( M. ]) J+ i; a5 T; x9 Q$ x5 z+ a
c[s] = temp;
& J4 H- u% z$ S: ?# ]* D
println(c);
) ~$ i9 t# M3 U' C+ L" i3 m" C* [
t++;
}
4 g" A6 Z7 E( Y/ Y) v* n
}
' l0 r2 m6 I) [4 v; j
public static void println(char[] c){
8 `/ K1 \+ [% V9 H, T! N! i; P
System.out.println(new String(c));
, Z' {+ p( f& h0 y/ Y6 Y
}
! u4 u2 A! J6 Q' D& a2 ]* x4 v0 h& R
}
1 F; z/ c6 n( U+ O
输出结果:
& m4 B" M: l1 y2 w. F; i9 s
123
$ w) @5 c( d& G) f( x {
132
213
# L2 V4 _. R7 ~8 i
231
$ \, N; {& s% `. i! o& p) v3 d
321
( J0 J M- G0 W2 w# g2 f5 C5 }
312
! x3 o2 g/ A6 L
6
/ k# n$ r$ v* T
设计思路:
& y+ \1 i* g% G7 h/ [0 M/ T, O4 W
1、n个字符,顺序选取其中第1个;
. _* \" n- J" ?
: r: a8 g i( R5 A5 X
2、在剩下的n-1个字符中,再选取其中的第1个;
+ B. j( |+ s/ B1 F5 I& E9 O
. @4 ]+ o6 Z6 H9 f( J: `3 [+ Y
3、若剩余的字符只剩下2个,则这两个字符交换位置;若不是,则继续第2步。
9 n" F, u! J6 @& D
4、这是一个典型的递归,无论有多少个字符,到最后只需交换最后两个字符即可。
! R' a* y7 e# [ f
5、为了能按顺序选取字符(因为递归之后会影响字符的顺序,如:“abcd”经过第一轮递归之后变成“adbc”,这时再执行第2步的话,取到的字符是“d”,而不是“b”),所以这里使用了数组拷贝,for循环不受递归的影响。(这个问题想了老半天,暂时只能用这种方法,即使效率比较低)。
5 l; @, s& P# A- ~7 K g3 f
* S/ N' \' ^0 m
6、组合的个数是字符个数的阶层,如“abc”,组合个数为3!=6
Zeuux © 2024
京ICP备05028076号