Printing all possible subsets of a list

后端 未结 7 1270
半阙折子戏
半阙折子戏 2020-12-28 11:18

I have a List of elements (1, 2, 3), and I need to get the superset (powerset) of that list (without repeating elements). So basically I need to create a List of Lists that

相关标签:
7条回答
  • 2020-12-28 11:49

    A java solution based on Petar Minchev solution -

    public static List<List<Integer>> getAllSubsets(List<Integer> input) {
        int allMasks = 1 << input.size();
        List<List<Integer>> output = new ArrayList<List<Integer>>();
        for(int i=0;i<allMasks;i++) {
            List<Integer> sub = new ArrayList<Integer>();
            for(int j=0;j<input.size();j++) {
                if((i & (1 << j)) > 0) {
                    sub.add(input.get(j));
                }
            }
            output.add(sub);
        }
    
        return output;
    }
    
    0 讨论(0)
  • 2020-12-28 11:50

    This is the simple function can be used to create a list of all the possible numbers generated by digits of all possible subsets of the given array or list.

    void SubsetNumbers(int[] arr){
        int len=arr.length;
        List<Integer> list=new ArrayList<Integer>();
        List<Integer> list1=new ArrayList<Integer>();
        for(int n:arr){
            if(list.size()!=0){
                for(int a:list){
                    list1.add(a*10+n);
                }
                list1.add(n);
                list.addAll(list1);
                list1.clear();
            }else{
                list.add(n);
            }
        }
        System.out.println(list.toString());
    }
    
    0 讨论(0)
  • 2020-12-28 11:53

    I've noticed that answers are focused on the String list. Consequently, I decided to share more generic answer. Hope it'll be fouund helpful. (Soultion is based on another solutions I found, I combined it to a generic algorithem.)

    /**
     * metod returns all the sublists of a given list
     * the method assumes all object are different
     * no matter the type of the list (generics)
     * @param list the list to return all the sublist of
     * @param <T>
     * @return list of the different sublists that can be made from the list object
     */
    public static <T>  List<List<T>>getAllSubLists(List<T>list)
    {
        List<T>subList;
        List<List<T>>res = new ArrayList<>();
        List<List<Integer>> indexes = allSubListIndexes(list.size());
        for(List<Integer> subListIndexes:indexes)
        {
            subList=new ArrayList<>();
            for(int index:subListIndexes)
                subList.add(list.get(index));
            res.add(subList);
        }
        return res;
    }
    /**
     * method returns list of list of integers representing the indexes of all the sublists in a N size list
     * @param n the size of the list
     * @return list of list of integers of indexes of the sublist
     */
    public static List<List<Integer>> allSubListIndexes(int n) {
        List<List<Integer>> res = new ArrayList<>();
        int allMasks = (1 << n);
        for (int i = 1; i < allMasks; i++)
        {
            res.add(new ArrayList<>());
            for (int j = 0; j < n; j++)
                if ((i & (1 << j)) > 0)
                    res.get(i-1).add(j);
    
        }
        return res;
    }
    
    0 讨论(0)
  • 2020-12-28 11:56
    import java.io.*;
    import java.util.*;
    class subsets
    {
        static String list[];
        public static void process(int n)
        {
            int i,j,k;
            String s="";
            displaySubset(s);
            for(i=0;i<n;i++)
            {
                for(j=0;j<n-i;j++)
                {
                    k=j+i;
                    for(int m=j;m<=k;m++)
                    {
                        s=s+m;
                    }
                    displaySubset(s);
                    s="";
                }
            }
        }
        public static void displaySubset(String s)
        {
            String set="";
            for(int i=0;i<s.length();i++)
            {
                String m=""+s.charAt(i);
                int num=Integer.parseInt(m);
                if(i==s.length()-1)
                    set=set+list[num];
                else
                    set=set+list[num]+",";
            }
            set="{"+set+"}";
            System.out.println(set);
        }
        public static void main()
        {
            Scanner sc=new Scanner(System.in);
            System.out.println("Input ur list");
            String slist=sc.nextLine();
            int len=slist.length();
            slist=slist.substring(1,len-1);
            StringTokenizer st=new StringTokenizer(slist,",");
            int n=st.countTokens();
            list=new String[n];
            for(int i=0;i<n;i++)
            {
                list[i]=st.nextToken();
            }
            process(n);
        }
    }
    
    0 讨论(0)
  • 2020-12-28 12:08

    In the given solution we iterate over every index and include current and all further elements.

    class Solution {
            public List<List<Integer>> subsets(int[] nums) {
                List<List<Integer>> ans = new ArrayList<>();
                if(nums == null || nums.length ==0){
                    return ans;
                }
                Arrays.sort(nums);
                List<Integer> subset = new ArrayList<>();
                allSubset(nums, ans , subset , 0);
                return ans;
            }
            private void allSubset(int[] nums,List<List<Integer>> ans ,List<Integer> subset , int idx){
                ans.add(new ArrayList<>(subset));
                for(int i = idx; i < nums.length; i++){
                    subset.add(nums[i]);
                    allSubset(nums, ans , subset , i+1);
                    subset.remove(subset.size() - 1);
                }
            }
            
    }
    
    0 讨论(0)
  • 2020-12-28 12:11

    Use bitmasks:

    int allMasks = (1 << N);
    for (int i = 1; i < allMasks; i++)
    {
        for (int j = 0; j < N; j++)
            if ((i & (1 << j)) > 0) //The j-th element is used
               System.out.print((j + 1) + " ");
    
        System.out.println();
    }
    

    Here are all bitmasks:

    1 = 001 = {1}
    2 = 010 = {2}
    3 = 011 = {1, 2}
    4 = 100 = {3}
    5 = 101 = {1, 3}
    6 = 110 = {2, 3}
    7 = 111 = {1, 2, 3}
    

    You know in binary the first bit is the rightmost.

    0 讨论(0)
提交回复
热议问题