C语言求字母的全部组合

来源:互联网 发布:json.parsearray 用法 编辑:程序博客网 时间:2024/05/21 11:10

使用的递归的方法:既然是组合,则顺序不要求顺序了。

主要原理就是从第一个字符开始,分两种情况:1.留下此字符;2.去除此字符。 再对剩下的字符求组合。

然后再第二个字符,分两种情况,再对剩下的字符求组合

转载请注明出处:http://blog.csdn.net/fdl19881/article/details/7983268

#include <stdlib.h>#include <stdio.h>#include <string.h>template <typename T>inline void swap(T &a , T &b){T tmp;tmp = a;a = b;b = tmp;}void doPrintAllCombination(char *str , int begin , int end){if(begin == end) {char tmp;if(end != 0) {        //i要此字符时tmp = str[end];str[end] = '\0';printf("%s\n",str);str[end] = tmp;}tmp = str[end+1];  //不要此字符str[end+1] = '\0';printf("%s\n" , str);str[end+1] = tmp;return;}        //第二种情况,去除此字符swap(str[begin],str[end]);doPrintAllCombination(str , begin , end-1);swap(str[begin] , str[end]);        //第一种情况,留下此字符doPrintAllCombination(str , begin+1 , end);}void printAllCombination(char *str){doPrintAllCombination(str , 0 , strlen(str)-1);}int main(int argc , char *argv[]){if(argc != 2) {printf("usage: %s <string>\n" , argv[0]);return -1;}char *str = (char*)malloc(strlen(argv[1]) + 1);strcpy(str , argv[1]);printf("orignate string : %s\n" , str);printAllCombination(str);free(str);return 0;}

结果:

orignate string : abc
b
c
cb
a
ac
ab
abc

结果中有些字符的顺序改变了,如cb ,,按正常顺序可能是bc,,,

这是因为我的这个程序的空间复杂度为O(1)

如果你要求产生的组合与原始字符的顺序一致,,则可以使用mask代替,,标记使用不使用此字符。此时空间复杂度为O(N)

反正时间复杂度都为O(N)