Java 开发者  - 讨论区

标题:java编写字符串全组合输出

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
/ 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哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号