子集生成(bit、递归、子集生成)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18218335/article/details/84788817
#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章组合算法部分介绍了生成子集的三种方式:按排序生成、二进制位变换、格雷码。我没看,改天看看学习一下

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/84788817