如何输出一个字符串的所有组合
方法一:递(sangxin)归(bingkuang)法,遍历字符串,每个字符只能取或不取。取该字符的话,就把该字符放到结果字符串中,遍历完毕后,输出结果字符串。
代码如下:
#include "stdafx.h" #include <stdio.h> #include <string.h> void CombineRecursiveImpl(const char* str, char* begin, char* end) { if (*str == 0) { *end = 0; if (begin != end) printf("%s", begin); return; } CombineRecursiveImpl(str + 1, begin, end); *end = *str; CombineRecursiveImpl(str + 1, begin, end + 1); } void CombineRecursive(const char str[]) { if (str == NULL) return; const int MAXLENGTH = 64; char result[MAXLENGTH]; CombineRecursiveImpl(str, result, result); } int main() { CombineRecursive("abc"); printf("\n"); getchar(); return 0; }
效果如图:
方法二:字符串构造法,即构造一个长度为n的01字符串表示输出结构中是否包含某个字符。这需要两层循环,外层循环表示每个组合,内层循环表示每个组合分别取哪些字符。
代码如下:
#include "stdafx.h" #include <stdio.h> #include <string.h> void Combine(const char str[]) { if (str == NULL || *str == 0) return; const int MAXLENGTH = 64; int len = strlen(str); bool used[MAXLENGTH] = { 0 }; char cache[MAXLENGTH]; char *result = cache + len; *result = 0; while (1) { int index = 0; while (used[index]) { used[index] = false; result++; index++; if (index == len) return; } used[index] = true; result--; *result = str[index]; printf("%s ", result); } } int main() { Combine("abc"); printf("\n"); getchar(); return 0; }
效果如图: