题目:
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符abc,则打印出由字符a、b、c所能组合出来的所有字符串a、b、c、ab、ac、bc、abc‘。
前面的博客中解析了全排列的问题,当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合,比如ab和ba是不同的排列,但只算是一个组合
基本思路:
子问题:
求n个字符组成长度为m的组合的问题分解成两个子问题
(1)求n-1和字符中长度为m-1的组合
(2)求n-1和字符的长度为m的组合
结束条件;
(1)已经取到了m个字符
(2)一个取到了最后一个字符,但是字符数还没有到m个
代码如下:
void Combination(char arr[], int length)
{
void Process1(char arr[], int index, int m, int n, vector<char> result);
if (arr == NULL || length < 1)
{
return;
}
vector<char> result;
for (int i = 1; i <= length; i++)
{
Process1(arr, 0, i, length, result);
}
}
void Process1(char arr[],int index, int m, int n, vector<char> result)
{
if (m == 0)
{
static int count = 1;
cout << "第" << count << "个组合为:";
vector<char>::iterator iter = result.begin();
for (; iter < result.end(); ++iter)
{
cout <<*iter;
}
cout << endl;
}
if (arr[index] == '\0')
{
return;
}
for (int i = index; i < n; ++i)
{
result.push_back(arr[i]);
Process1(arr, i+1, m - 1, n, result);
result.pop_back();
}
}
因为每个组合的大小不一样,所以就使用了库函数中的vector,相当于动态顺序表。
有两种编列方法:
(1)数组下标
(2)迭代器
测试用例:
void Test1()
{
char arr[] = "123";
Combination(arr, 3);
}
运行结果: