zoukankan      html  css  js  c++  java
  • 求一个序列的全部排列

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

    事实上也能够使用递归的方法解决,兴许问题。STL中的方法也攻克了有反复字符的问题。

    思路:

             借助了字典序的方法,首先将序列依照升序进行排序(当然也能够使用降序排列。都是一样的道理),将这个序列作为一个字典序的输入序列。从这个字典序怎样变换出下一个字典序列呢?对这个序列从后往前进行搜索。找到一对相邻的升序元素,元素的位置分别为i和j(i<j)。

    假设能找到这种一对元素,说明全部的组合还存在,假设没有找到这种一对元素。说明全部的组合都已经找到,算法结束。

    假设找到了这种一对元素,那么继续从后往前找到第一个符合条件的元素,使得此元素大于第i个元素。此元素的位置为k,那么交换第i个元素和第k个元素,然后将从第j个元素(包含第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
    ",str);
    
        //从后往前找到一对相邻的升序元素(i<j)
    
        for(j=len-1,i=j-1;j>=0;i--,j--)
    
                if(str[i] < str[j])
    
                    break;
    
       //说明全部的组合都已经结束
    
       if(i == -1)
    
          return;
    
       //从后往前找一个元素大于i
    
       for(k=len-1,k>=0;k--)
    
           if(str[k] > str[i])
    
              break;
    
        swap(&str[i],&str[k]);
    
       reserve(j,len-1,str);
    
    }


  • 相关阅读:
    团队与领导力健康检查 | 体检表
    如何改变组织文化
    如何在各种文化背景下成功敏捷
    OKR痛点与误区 | 敏捷家分享007
    Scrum培训感想
    如何讲好故事
    Lc70_爬楼梯
    Lc641_设计循环双端队列
    Lc32_最长有效括号
    Lc239_滑动窗口最大值
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5057185.html
Copyright © 2011-2022 走看看