C|字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来。

全排列 所谓全排列,就是打印出字符串中所有字符的所有排列。例如输入字符串abc,则打印出 a、b、c 所能排列出来的所有字符串 abcacbbacbcacabcba



#include #includestatic int number=0; void Swap(char *a ,char *b) { char temp = *a; *a = *b; *b = temp; }void AllRange(char* str,int start,int length) { if(start == length-1) { printf("%s\n",str); number++; } else { for(int i=start; i<=length-1; i++) { Swap(&str[start],&str[i]); AllRange(str,start+1,length); Swap(&str[start],&str[i]); } } }void Permutation(char* str) { if(str == NULL) return; AllRange(str,0,strlen(str)); }void main() { char str[] = "abcde"; Permutation(str); printf("number=%d\n",number); }




全组合
如果不是求字符的所有排列,而是求字符的所有组合应该怎么办呢?还是输入三个字符 a、b、c,则它们的组合有a b c ab ac bc abc。当然我们还是可以借鉴全排列的思路,利用问题分解的思路,最终用递归解决。不过这里介绍一种比较巧妙的思路 —— 基于位图。
假设原有元素 n 个,则最终组合结果是 2n?1 个。我们可以用位操作方法:假设元素原本有:a,b,c 三个,则 1 表示取该元素,0 表示不取。故取a则是001,取ab则是011。所以一共三位,每个位上有两个选择 0 和 1。而000没有意义,所以是2n?1个结果。
这些结果的位图值都是 1,2…2^n-1。所以从值 1 到值 2n?1 依次输出结果:
001,010,011,100,101,110,111 。对应输出组合结果为:a,b,ab,c,ac,bc,abc
因此可以循环 1~2^n-1,然后输出对应代表的组合即可。有代码如下:

#include #includestatic int number=0; void Combination(char *str) { if(str == NULL) return ; int len = strlen(str); int n = 1<






反转字符串 main.c
【C|字符串排列组合算法】
#include #includevoid print(char *str) { if(*str!='\0')print(str+1); if(*str!='\0') printf("%c",*str); }int main(int argc,char **argv) { char *buff="hello world"; print(buff); printf("\n"); return 0; }





    推荐阅读