子集生成与字典序

Posted -ifrush

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子集生成与字典序相关的知识,希望对你有一定的参考价值。

题目描述

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

给定一个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("
");
    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("}
") ;
    return 0;
}

以上是关于子集生成与字典序的主要内容,如果未能解决你的问题,请参考以下文章

DLUTOJ 1209 字典序和r-子集

生成子集 (增量构造法)

如何生成计数器的所有子集?

Python代码阅读(第40篇):通过两个列表生成字典

940C Phone Numbers

字典序法生成全排列算法图