#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <cmath>
using namespace std;
void enumSubSetByRecurion(const string& strInput)
{
}
void enumSubSetByAnd(const string& strInput)
{
const size_t length = strInput.length();
size_t totalCount = static_cast<size_t>(pow(static_cast<double>(2),static_cast<double>(length)));
cout << "strInput Length\t" << length << endl;
cout << "strInput totalCount\t" << totalCount << endl;
vector<string> vecStr;
vecStr.resize(totalCount);
int iIndex = 0;
for(int i = 0;i < strInput.length();i++)
{
int iPre = iIndex;
for(int iAdd = 0;iAdd < iPre;iAdd++){
vecStr[iIndex++] = vecStr[iAdd] + strInput[i];
}
vecStr[iIndex++] = strInput.substr(i,1);
}
cout << "Count\t" << iIndex << endl;
for(auto & strTemp : vecStr)
cout << strTemp << endl;
}
void enumSubSetByBit(const string& strInput)
{
// 这里使用的是,普通10进制顺序,还有其它顺序
// gray code 顺序
int length = strInput.length();
size_t totalCount = pow(2,length);
vector<string> result = {};
for(size_t i = 1;i < totalCount; i ++)
{
string temp = {};
for(int j = 0;j < length;j ++)
{
if(i & (1<<j)) {
temp += strInput[j];
}
}
result.push_back(temp);
}
cout << "Count\t" << result.size() << endl;
for(auto item : result)
cout << item << endl;
}
void enumSubStringRecursive(const string& strInput,const int iIndex,bool* const bArray)
{
if(iIndex == -1)
{
for (int i = 0;i < strInput.length();i++)
if(bArray[i]) putchar(strInput[i]);
cout << endl;
return;
}
enumSubStringRecursive(strInput,iIndex - 1,bArray);
bArray[iIndex] = true;
enumSubStringRecursive(strInput,iIndex - 1,bArray);
bArray[iIndex] = false;
}
void enumSubStringRec(const string& strInput)
{
bool * bA = new bool(strInput.length());
for(int i = 0;i < strInput.length();i++) bA[i] = false;
enumSubStringRecursive(strInput,strInput.length()-1,bA);
delete [] bA;
}
void enumSubString(const string& strInput)
{
int length = strInput.length();
cout << length << endl;
for(size_t i = 0;i < length; i++)
{
cout << "current string:-----------------" <<
endl << strInput << endl <<
"-------------------------------"<<endl;
for(size_t j = 1;j < length - i + 1;j ++)
{
auto strSub = strInput.substr(i,j);
reverse(strSub.begin(),strSub.end());
cout << strSub << endl;
//cout << strInput.substr(i,j) << endl;
}
}
}
int main()
{
//enumSubSetByAnd("1234567");
enumSubStringRec("1234567");
return 0;
}
枚举给定集合的子集,这里介绍,三种方法:
1. bit
2. 循环添加
3. 递归
看网上很多文章,貌似,有本书,专门介绍了三种方法:Skiena在《算法设计手册》第14章组合算法部分介绍了生成子集的三种方式:按排序生成、二进制位变换、格雷码。我没看,改天看看学习一下