码迷,mamicode.com
首页 > 其他好文 > 详细

求一个序列的所有组合

时间:2014-10-11 17:11:25      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:c++

在C++ STL标准模板库中已经有线程的思想,这样就是介绍STL中的思想。

其实也可以使用递归的方法解决,后续问题,STL中的方法也解决了有重复字符的问题。

思路:

         借助了字典序的方法,首先将序列按照升序进行排序(当然也可以使用降序排列,都是一样的道理),将这个序列作为一个字典序的输入序列,从这个字典序如何变换出下一个字典序列呢?对这个序列从后往前进行搜索,找到一对相邻的升序元素,元素的位置分别为i和j(i<j)。如果能找到这样的一对元素,说明所有的组合还存在,如果没有找到这样的一对元素,说明所有的组合都已经找到,算法结束。如果找到了这样的一对元素,那么继续从后往前找到第一个符合条件的元素,使得此元素大于第i个元素,此元素的位置为k,那么交换第i个元素和第k个元素,然后将从第j个元素到最后一个元素进行反转,这样得到的一个序列就是下一个输入的字典序列。

程序代码

#include <stdio.h>

#include <stdlib,h>

#include <string.h>

//反转元素

void reserve(int begin,int end.char* str)

{

   while(begin < end)

   {

         char temp = str[begin];

         str[begin]  = str[end];

         str[end]   = temp;

          begin++;

           end++;

   ]

]

//交换两个元素

void swap(char* src,char* dest)

{

     char temp = *src;

     *src = *dest;

     *dest = temp;

}

void next_premutaion(char* str)

{

     int i,j,k;

     int len = strlen(str);

    // 作为一个新的输入序列 首先输出

    printf("%s\r\n",str);

    //从后往前找到一对相邻的升序元素(i<j)

    for(j=len-1,i=j-1;j>=0;i--,j--)

            if(str[i] < str[j])

                break;

   //说明所有的组合都已经结束

   if(i == -1)

      break;

   //从后往前找一个元素大于i

   for(k=len-1,k>=0;k--)

       if(str[k] > str[i])

          break;

    swap(&str[i],&str[k]);

   reserve(j,len-1,str);

}


求一个序列的所有组合

标签:c++

原文地址:http://blog.csdn.net/yusiguyuan/article/details/39994663

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!