题目:
求字符的所有组合,例如输入abc, 则他们的所有组合有a、b、c、ab、ac、bc、abc。
分析:
如果输入n个字符,则这n个字符所构成长度为1的组合,长度为2的组合,......,长度为n的组合。求n个字符的长度为m(1<=m<=n)的组合的时候,我们把这n个字符分成两部分:第一个字符和其余的所有字符。如果组合中包含第一个字符,则下一步在剩下的字符例选取m-1个字符;如果组合里不包含第一个字符,则在剩下的字符里选取m个字符。也就是说,我们可以把求n个字符组成长度为m的组合问题分解成两部分,分别求n-1个字符串中长度为m-1的组合,以及求n-1个字符的长度为m的组合。这两种方式都可以用递归的方式解决。
源代码如下:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
static int num = 1;
void Combination(char *string, int number, vector<char> &result);
void Combination(char *string)
{
if (string == NULL)
{
cout << "字符为空" << endl;
return;
}
vector<char> result;
int i, length = strlen(string);
for (i = 1; i <= length; ++i)
Combination(string, i, result);//在长度为string字符串中取出i个组合数
}
void Combination(char *string, int number, vector<char> &result)
{
if (string == NULL)
return;
if (number == 0)
{
printf("第%d个组合\t", num++);
vector<char>::iterator iter = result.begin();
for (; iter != result.end(); ++iter)
printf("%c", *iter);
printf("\n");
return;
}
if (*string == '\0')
return;
result.push_back(*string);
Combination(string + 1, number - 1, result);
result.pop_back();
Combination(string + 1, number, result);
}
void test11()
{
cout << "\t=======检测空指针=======" << endl;
Combination(NULL);
cout << endl;
}
void test12()
{
cout << "\t=======检测只有分隔符的指针=======" << endl;
num = 1;
char str[] = "";
Combination(str);
cout << endl;
}
void test13()
{
cout << "\t=======检测只有一个字符的组合=======" << endl;
num = 1;
char str[] = "a";
Combination(str);
cout << endl;
}
void test14()
{
cout << "\t=======检测只有若干个字符的组合=======" << endl;
num = 1;
char str[] = "abc";
Combination(str);
cout << endl;
}
int main(void)
{
test11();
test12();
test13();
test14();
system("pause");
return 0;
}
运行结果:
=======检测空指针=======
字符为空
=======检测只有分隔符的指针=======
=======检测只有一个字符的组合=======
第1个组合 a
=======检测只有若干个字符的组合=======
第1个组合 a
第2个组合 b
第3个组合 c
第4个组合 ab
第5个组合 ac
第6个组合 bc
第7个组合 abc
请按任意键继续. . .