字符串的所有组合
如果求字符串的所有排列,而是求字符串的所有组合,当输入的字符串是“abc”则它的组合有“a”“b”“c”“ab”“ac”“bc”“abc”。
N个字符的全部组合问题可以分解成从N中1至N个字符组合,而对于从N中取M个数组合,可以分为以下两种情况:
①取这N个字符中的第一个字符,再从后面N-1个字符中取M-1个;
②不取这N个字符中的第一个字符,再从后面N-1个字符中取出M个;
可以简单的理解为解的过程为一个二叉树每次都有选择和不选择两个选项,将选择的暂时存放在一个vector类中,每次递归字符串指针向后移动一位。
/*
字符串的所有组合
例如 “abc”输出“a”“b”“c”“ab”“ac”“bc”“abc”
*/
#include <iostream>
#include <vector>
using namespace std;
void Combination(char * s, int n, vector<char> res); //从中取n个元素的组合输出
int main()
{
char sInput[] = "abcde";
vector<char> Result;
for (int i = 1; i <= strlen(sInput); i++)
{
Combination(sInput, i, Result);
cout << endl;
}
cin.get();
return 0;
}
void Combination(char * s, int n,vector<char> res)
{
/*
字符串的所有组合
输入: *s ---输入字符串
n ---取出的符号数
res ---保存结果
*/
if (n>strlen(s)||s == NULL)
{
return;
}
if (n==0)
{
for (vector<char>::iterator temp = res.begin(); temp != res.end(); temp++)
{
cout << *temp;
}
cout << " ";
return;
}
if (*s=='\0')
{
return;
}
else
{
Combination(s + 1, n, res);
//不取第一位,从余下取n位
res.push_back(*s);
//将第一位暂存
Combination(s + 1, n-1, res);
//取第一位,从余下位取出n-1位
res.pop_back();
}
}
运行结果
典型的递归问题,注意递归是否有明确的出口,否则会出现问题。