排列和组合相关问题总结

目录

一、全排列问题

二、组合问题

三、排列、组合问题的变种

 

一、全排列问题

    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进行处理即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值