组合算法问题
一、问题描述
如输入字符串“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);
}
四、程序结果