• 子集生成与字典序


    题目描述
    
    请编写一个方法,返回某集合的所有非空子集。
    
    给定一个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;
    }
  • 相关阅读:
    JSP
    token防止表单重复提交
    web应用程序性能优化
    js 优化
    文本查看及处理工具简单命令
    DNS之一---DNS服务及BIND服务,并实现DNS正向与反向解析
    企业级自动化运维工具应用实战ansible
    Linux小试牛刀
    Linux特殊权限及ACL权限
    文件的默认权限UMASK
  • 原文地址:https://www.cnblogs.com/-ifrush/p/10310217.html
Copyright © 2020-2023  润新知