字母全排列快速算法C代码
q' D7 T5 H0 T; u 全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA.
3 y) r; U G- t //原理是插入, 在一个字符串的所有位置插入新字符.0 n) k! w/ h. A: i: u/ c- a
//如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABC0 p9 R4 F: J: N8 t( i
char *AllList(char *str, int *pNum)$ g* V: y0 Z ^3 k* v- z" `
{( P$ E/ h9 q+ I7 u( p( d* {
int i, j, k, n;3 b; U3 F( c( r+ n8 W5 _
int len = strlen(str);3 B) K8 I& X( O9 H2 ^: [( f2 \
int Total = 0;5 d8 [ ~+ y1 n5 E4 U
int count, oldcount;4 B/ H1 G, j2 E% f
int size;
2 n: Q, L4 k# y char *Buf;
7 f% r% I) L0 f* A* a* l char *p, *p1;4 B; b* W) c1 G5 i; T; _0 ]6 h" X
if (len > 10) return NULL;* C! _+ Y5 z$ h |
//计算总的组合数目
, E; y8 P, n; l; T$ J. {& H4 ^ for (i = 0, j = 1; i < len; i++)
/ ]9 z4 ?4 S4 \5 H, }6 J6 U {: K# h- N9 s3 j: S: Z7 G
j *= (len - i);
3 `+ s" y( I: G6 H) k' I) { Total += j;. q2 x, O; ]& |# W
}& |$ [1 N1 X, g0 |7 ?
//创建二维数组, 存放全部组合% E m m0 `# T9 {: |7 r/ y
size = len + 1;7 \- R) s/ S5 L& `0 e7 q" F) h$ Z
if ((Buf = (char *)malloc(Total * size)) == NULL)- G" y$ }/ H& z' e
{
3 {( r7 P! C4 G7 f) g" m5 | return NULL;
: _: H& c6 |$ N+ R( U }
9 Z- B; |6 @! N for (k = 0, count = 0; k < len; k++) //所有要插入的字符& H* @9 ~0 s3 l4 L2 [* X
{( m/ l- @( p! u' d9 R; ~
oldcount = count;
7 r# Z1 R {9 X& v p = Buf;
: y$ S G1 M# x( `/ C% v; |; I p1 = Buf + count * size; e, A9 |6 g+ ~' I* G
for (i = 0; i < oldcount; i++, p += size) //插入到所有字符串中,形成新的字符串
2 a* h- x6 ^0 h( K {
; L( F/ l' |1 w9 f" S# t n = strlen(p);
( [; M- O6 t2 c/ R
& b- H( C. q0 I1 H1 m& p9 x for (j = 0; j |