目录
一、全排列问题
二、组合问题
三、排列、组合问题的变种
一、全排列问题
1.c++标准库函数next_permunation
算法原理:利用字典序进行排序
第一步:从右往左,找到第一个升序位置i,为x;
第二步:从位置i+1开始,找到第一个大于i元素的位置,记为j,为y;
第三步:交换i和j的元素,记交换x和y;
第四步:将i后面的元素翻转;
2.递归的方式
算法原理:将序列分为第一个字母和后面的字母,采用递归的方式实现
二、组合问题
算法原理:
第一步:采用0、1表示的方式
10000:5个元素中选择一个
11000:5个元素中选择两个
......
11111:5个元素中选择五个
第二步:用全排列函数next_permunation得到上述所有的情况
第三步:将结果映射回去就可以得到所有的组合情况
三、排列、组合问题的变种
1.字典序的所有排列
如果待排列的为“ab",则所有的情况为:”aa"、“ab”、“ba”、“bb";
解法:运用递归的思想,递归的结束标志为:输出的个数为字符串的长度
void calperm(const string &str, string &temp,int size)
{
if (str.empty())
return;
if (size == str.size())
{
size = 0;
cout << temp << endl;
}
else
{
for (int i = 0; i < str.size(); ++i)
{
temp[size] = str[i];
calperm(str, temp, size + 1);
}
}
}
备注:上面所有的情况都是在待排的字符串没有重复的情况下进行的,如果有从重复的字符串,利用set进行处理即可。