【问题标题】:Displaying sets and subsets of a string显示字符串的集合和子集
【发布时间】:2020-02-13 04:10:53
【问题描述】:

我正在尝试查找子集并以二进制表示形式输出它们。

示例:

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;
}

【问题讨论】:

  • 什么子集?请清楚说明您的问题!
  • 只有另一个字符串参数,比如binary_sofar。对于包含第一个字母的情况,将'1' 附加到binary_sofar;如果不包含该字母,请附加'0'。原字符串用完后与sofar一起打印。

标签: c++ c++11 binary set subset


【解决方案1】:

你也可以换一种方式,先生成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;
}

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多