ビットマップ法を用いて文字列の組合せを求める(ビット演算シミュレーション加算と同様)

1836 ワード

タイトル:文字列を入力し、その文字列のすべての組合せを出力します.例えば、abcが入力されると、その組み合わせはa、b、c、ab、ac、bc、abcである.
解析:文字列で加算操作をシミュレートするのと同じように、すべての組合せを印刷するには、ビット数グループを使用します.ただし、文字列シミュレーションで加算する操作は10進1、ビットシミュレーションでは2進1です.abcを例にとると:
初期化ビットbitset<3>シミュレーションは、1を加算するたびに、000---001---010--011---100---101---110--111に変化する.あるビットが0の場合、出力せず、1の場合abcに対応するビットを出力する.
ソースコードは次のとおりです.
#include <iostream>
#include <bitset>
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::bitset;

//   c++ bitset       。   bitset<n>  n          
//                     ,    n。  STR   ,  
//       CHAR_COUNT   
const string STR = "abc"; 
const int CHAR_COUNT = 3; //      

bool Increment(bitset<CHAR_COUNT>&bits)
{
	if(CHAR_COUNT <= 0)
		return false;
	for(int i = CHAR_COUNT-1; i >=0; i--)
	{
		if(0 == bits[i])
		{
			bits[i] = 1;
			break;
		}
		else 
		{
			if(i != 0) 
			{
				bits[i] = 0; //        ,    0
			}
			else
			{
				return false; //     1 ,         
			}
		}
	}
	return true;
}
void Print(const bitset<CHAR_COUNT>&bits, const string&str)
{
	if(CHAR_COUNT <= 0 || CHAR_COUNT != str.length())
	{
		return;
	}
	for(int i = 0; i != CHAR_COUNT; i++)
	{
		if(1 == bits[i])
			cout << str[i];
	}
	cout << endl;
}

void Combination()
{
	bitset<CHAR_COUNT> bits;
	while(Increment(bits))
	{
		Print(bits, STR);
	}
}
int main()
{
	Combination();
	system("pause");
}