• 组合算法问题


    一、问题描述

    如输入字符串“abc”,其中字符串的元素是不重复的,那么它的所有组合是a,b,c,ab,ac,bc,abc共七种。

    二、问题分析

    这个问题是个数学问题,根据所学的知识,所有组合的情况是2^n-1。我们可以利用C语言中的按位操作符进行分析。如abc,

    用二进制表示可以有如下几种:000,001,010,011,100,101,110,111.当然要去掉000这种,其余刚好是7种。我们可以把1看成取对应位置的元素,如001代表c,110代表ab,111代表abc.

    三、程序设计

    #include<iostream>
    #include<string>
    #include<vector>
    #include<algorithm>


    using namespace std;


    int num=0;

    bool compare(const string &s1,const string &s2)    //字符串大小的比较方式,按照字符串的长度比较
    {
               return s1.size()<s2.size();                        //按照字符串长度从小到大排序
    }


    void main()
    {
           string in_s;

           vector<string> out_s;                     //存储字符向量

           cout<<"请输入一个字符串:"<<endl;
           cin>>in_s;

           int length=in_s.size();
           int number=1<<length;                  //如abc,长度是3,此时number=1000,对应十进制是8

           for(int i=1;i<number;i++)               //组合的可能数,按照上述分析,i=1-7,正好是所有的情况
           {
                  string temp_s;                        //临时变量,空的字符串

                  for(int j=0;j<length;j++)         //每种情况下的各个位置的字符,分别用001,010,100去读取每个位置的数
                  {
                         if(i&(1<<j))                      //如果对应的位置是1,代表该字符输出
                              temp_s+=in_s[j];
                  }

                  num++;                                  //数目加1

                  out_s.push_back(temp_s);        //压入向量容器中
            }

            sort(out_s.begin(),out_s.end());       //按照字典顺序进行排列,C++已有的泛型算法
            stable_sort(out_s.begin(),out_s.end(),compare);    //按照字符串的长度进行排列,compare函数已经定义了

            for(int i=0;i<out_s.size();i++)         //输出组合的情况
                     cout<<out_s[i]<<endl;

            cout<<"组合数目:"<<num<<endl;   //输出组合的数目

            while(1);
    }

    四、程序结果

  • 相关阅读:
    C# winform 学习(三)
    (Java实现) 均分纸牌
    (Java实现) 拦截导弹
    Delphi从内存流中判断图片格式(好多相关文章)
    Qt之QTableView显示富文本(使用了QAbstractTextDocumentLayout和QTextDocument)
    MAC和PHY的区别(网线上传递的是模拟信号)
    Qt之模型/视图(自定义按钮)(重绘QStyleOptionButton)
    QQ音乐的请求
    Log4j、Log4j 2、Logback、SFL4J、JUL、JCL的比较
    LRU Cache
  • 原文地址:https://www.cnblogs.com/cxmhy/p/4466791.html
Copyright © 2020-2023  润新知