您的位置:首页 > 其它

利用位图方法求字符串的组合(类似于位运算模拟加法)

2012-08-02 10:13 288 查看
题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: