显示字符串的集合和子集

Displaying sets and subsets of a string

本文关键字:子集 集合 字符串 显示      更新时间:2023-10-16

我正在尝试找到子集并用二进制表示输出它们。

例:

000:EMPTY
001:C
010:B
011:B C
100:A
101:A C
110:A B
111:A B C

我有以下代码可以找到所有子集,但不确定二进制文件?

#include <iostream>
using namespace std;
void recsub(string sofar, string rest){
if(rest=="") cout<<sofar<<endl;
else{
recsub(sofar+rest[0], rest.substr(1)); //including first letter
recsub(sofar, rest.substr(1)); //recursion without including first letter.
}
}
void listsub(string str){
recsub("",str);
}
int main(){
listsub("abc");
return 0;
}

你可以用其他方式做,先生成mask,然后生成匹配的字符串。

#include <iostream>
using namespace std;
void listsub(const string &str) {
auto n = str.size();
// iterate over every binary representation
for (size_t k = 0; k < (1u << n); ++k) {
string binary;
string subset;
// iterate over every bit from right to left
for (size_t bit = n ; bit > 0; --bit) {
bool has_bit = (k & (1 << (bit - 1)));
binary.push_back(has_bit ? '1' : '0');
if (has_bit) {
subset.push_back(str[n - bit]);
}         
}
cout << binary << ':' << subset << endl;
}
}
int main() {
listsub("abc");
return 0;
}