输出一个集合的所有子集

113 篇文章 0 订阅

输出字符串的所有子集

如:对“abc”

输出:

 c b bc a ac ab abc



第一种做法: 2^n 遍历每个字符,每个字符只能取或者不取。取就把该字符加入结果中,遍历完毕后,输出结果字符串。

代码如下:

//
//  main.cpp
//  输出一个集合的所有子集
//
//  Created by zjl on 16/8/10.
//  Copyright © 2016年 zjl. All rights reserved.
//

#include <iostream>
#include <vector>
using namespace std;

void solve(string s, string& str, vector<string>& res, int num){
    if(num == s.size()){
        res.push_back(str);
        return;
    }
    
    solve(s, str, res, num+1);
    str += s[num];
    solve(s, str, res, num+1);
    str.erase(str.size()-1);
}

int main(int argc, const char * argv[]) {
    string s = "abc";
    vector<string> res;
    string str;
    solve(s, str, res, 0);
    for(auto a: res)
        cout<<a<<" ";
    cout<<endl;
    return 0;
}


第二种:

求字符串大小len,然后从1开始到len-1。

比如len=4, 则从1开始到3,每个为 001,010,011,100,101,111.

并对每个数字先跟1相与,并输出相应字符;然后往右>>移动,判断每个位置,若为1,则输出相应位置字符。


//
//  main.cpp
//  输出一个集合的所有子集
//
//  Created by zjl on 16/8/10.
//  Copyright © 2016年 zjl. All rights reserved.
//

#include <iostream>
#include <vector>
using namespace std;

void solve(string s, vector<string>& res){
    int len = s.size();
    int num = 1 << len;
    for(int i = 1; i < num; i++){
        int j = i;
        int k = 0;
        string str;
        while(j){
            if((j & 1) == 1){
                str += s[k];
            }
            k++;
            j = j >> 1;
        }
        res.push_back(str);
    }
    
}

int main(int argc, const char * argv[]) {
    string s = "abc";
    vector<string>res;
    solve(s, res);
    for(auto a: res)
        cout<<a<<" ";
    cout<<endl;
    return 0;
}






  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值