全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA.
//原理是插入, 在一个字符串的所有位置插入新字符.
//如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABC
1 char *AllList(char *str, int *pNum)
2 {
3 int i, j, k, n;
4 int len = strlen(str);
5 int Total = 0;
6 int count, oldcount;
7 int size;
8 char *Buf;
9 char *p, *p1;
10 if (len > 10) return NULL;
11 //计算总的组合数目
12 for (i = 0, j = 1; i < len; i++)
13 {
14 j *= (len - i);
15 Total += j;
16 }
17 //创建二维数组, 存放全部组合
18 size = len + 1;
19 if ((Buf = (char *)malloc(Total * size)) == NULL)
20 {
21 return NULL;
22 }
23 for (k = 0, count = 0; k < len; k++) //所有要插入的字符
24 {
25 oldcount = count;
26 p = Buf;
27 p1 = Buf + count * size;
28 for (i = 0; i < oldcount; i++, p += size) //插入到所有字符串中,形成新的字符串
29 {
30 n = strlen(p);
31 for (j = 0; j <= n; j++, count++, p1 += size) //在字符串所有位置插入
32 {
33 memcpy(p1, p, n);
34 p1[n] = p1[j];
35 p1[j] = str[k];
36 p1[n + 1] = '
在我的机器上排列10个字母大约0.5秒。