您的位置:首页 > 编程语言 > C语言/C++

C语言求字母的全部组合

2012-09-15 22:31 246 查看
使用的递归的方法:既然是组合,则顺序不要求顺序了。

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

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

转载请注明出处:/article/7805609.html

#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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: