子集生成与字典序

题目描述

请编写一个方法,返回某集合的所有非空子集。

给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
测试样例:

[123,456,789]

返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}

当数组内的元素是字典序排列,则生成子集时用位向量法生成的子集也是按字典序生成的;

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cctype>
#include<functional>
using namespace std;
int flag=0,cnt=0,a[100]={0},num[10]={0};
/*void print_set(int n,int cur,int *num){
    for(int i=0;i<cur;i++)printf("%d ",a[num[i]]);
    printf("\n");
    int s=cur? num[cur-1]+1:0;
    for(int i=s; i<n;i++){
        num[cur]=i;
        print_set(n,cur+1,num);
    }
}
*/
void print_set(int n,int cur,int *num,int fleg){
    //cout<<fleg<<endl;
  if(cur==n){
      if(!fleg)return;
      flag=0;
      if(cnt)printf(",");
      printf("[");
      for(int i=0;i<n;i++){
      if(num[i]&&flag)printf(",");
      if(num[i])printf("%d",a[i]);
      if(num[i])flag++;
      }
      printf("]");
      cnt++;
      return;
   }
    num[cur]=1;
    print_set(n,cur+1,num,1);
    num[cur]=0;
    print_set(n,cur+1,num,fleg);
}

int main(){
    int j,i;
    string s;
    cin>>s;
    //数组赋值 
    for(j=0,i=0;i<s.size();i++){
        if(isdigit(s[i]))a[j]=10*a[j]+s[i]-'0';
        if(s[i]==',')j++;
    }
    sort(a,a+j+1,greater<int>());
    //printf("%d",a[0]);
    printf("{");
    print_set(3,0,num,0);
    printf("}\n") ;
    return 0;
}
posted @ 2020-01-11 13:46  易如鱼  阅读(453)  评论(0编辑  收藏  举报