Recursive program to generate power set using Backtracking using Bottom Up Approach

The idea is to pick each element one by one from the input set, then generate a subset for the same, and we follow this process recursively. 

Follow the steps below to implement the above idea:

  • The base condition for the recursive call, when the current index becomes negative then add empty list into the allSubsets.
  • Make recursive call for the current index – 1, then we’ll receive allSubsets list from 0 to index -1
  • Create a list of list moreSubsets
  • Iterate over all the subsets that are received from above recursive call 
    • Copy all the subset into newSubset
    • Add the current item into newSubset
    • Add newSubset into moreSubsets
  • Add moreSubsets into allSubsets
  • Finally, return allSubsets.

Follow the steps below to implement the above approach:

C++




// C++ Recursive code to print
// all subsets of set using ArrayList
#include <bits/stdc++.h>
using namespace std;
  
vector<vector<string> > getSubset(vector<string> set,
                                  int index)
{
  vector<vector<string> > allSubsets;
  if (index < 0) {
    vector<string> v;
    allSubsets.push_back(v);
  }
  
  else {
    allSubsets = getSubset(set, index - 1);
    string item = set[index];
    vector<vector<string> > moreSubsets;
  
    for (vector<string> subset : allSubsets) {
      vector<string> newSubset;
      for (auto it : subset)
        newSubset.push_back(it);
      newSubset.push_back(item);
      moreSubsets.push_back(newSubset);
    }
    for (auto it : moreSubsets)
      allSubsets.push_back(it);
  }
  return allSubsets;
}
int main()
{
  
  vector<string> set = { "a", "b", "c" };
  
  int index = set.size() - 1;
  vector<vector<string> > result = getSubset(set, index);
  for (auto it : result) {
    cout << " [ ";
    for (auto itr : it) {
      cout << itr << ",";
    }
    cout << "],";
  }
}
  
// This code is contributed by garg28harsh.


Java




// Java Recursive code to print
// all subsets of set using ArrayList
import java.util.ArrayList;
  
public class PowerSet {
  
    public static void main(String[] args)
    {
  
        String[] set = { "a", "b", "c" };
  
        int index = set.length - 1;
        ArrayList<ArrayList<String> > result
            = getSubset(set, index);
        System.out.println(result);
    }
  
    static ArrayList<ArrayList<String> >
    getSubset(String[] set, int index)
    {
        ArrayList<ArrayList<String> > allSubsets;
        if (index < 0) {
            allSubsets
                = new ArrayList<ArrayList<String> >();
            allSubsets.add(new ArrayList<String>());
        }
  
        else {
            allSubsets = getSubset(set, index - 1);
            String item = set[index];
            ArrayList<ArrayList<String> > moreSubsets
                = new ArrayList<ArrayList<String> >();
  
            for (ArrayList<String> subset : allSubsets) {
                ArrayList<String> newSubset
                    = new ArrayList<String>();
                newSubset.addAll(subset);
                newSubset.add(item);
                moreSubsets.add(newSubset);
            }
            allSubsets.addAll(moreSubsets);
        }
        return allSubsets;
    }
}


Python3




# Python recursive code to print
# all subsets of set using ArrayList
  
  
def get_subset(s, index):
    all_subsets = []
    if index < 0:
        all_subsets.append([])
    else:
        all_subsets = get_subset(s, index-1)
        item = s[index]
        more_subsets = []
        for subset in all_subsets:
            new_subset = []
            for i in subset:
                new_subset.append(i)
            new_subset.append(item)
            more_subsets.append(new_subset)
        for i in more_subsets:
            all_subsets.append(i)
    return all_subsets
  
  
# Driver Code
set = ["a", "b", "c"]
index = len(set) - 1
result = get_subset(set, index)
  
for subset in result:
    print("[", end=" ")
    for item in subset:
        print(item, end=" ")
    print("],", end=" ")


C#




// c# code for the above approach
using System;
using System.Collections.Generic;
  
namespace Subsets {
public class GFG {
    static List<List<string> > GetSubsets(List<string> set,
                                          int index)
    {
        List<List<string> > allSubsets;
        if (index < 0) {
            List<string> emptyList = new List<string>();
            allSubsets
                = new List<List<string> >{ emptyList };
        }
        else {
            allSubsets = GetSubsets(set, index - 1);
            string item = set[index];
            List<List<string> > moreSubsets
                = new List<List<string> >();
            foreach(List<string> subset in allSubsets)
            {
                List<string> newSubset = new List<string>();
                foreach(string it in subset)
                {
                    newSubset.Add(it);
                }
                newSubset.Add(item);
                moreSubsets.Add(newSubset);
            }
            foreach(List<string> it in moreSubsets)
            {
                allSubsets.Add(it);
            }
        }
        return allSubsets;
    }
  
    static void Main(string[] args)
    {
        List<string> set
            = new List<string>{ "a", "b", "c" };
        int index = set.Count - 1;
        List<List<string> > result = GetSubsets(set, index);
        foreach(List<string> it in result)
        {
            Console.Write("[ ");
            foreach(string itr in it)
            {
                Console.Write(itr + " ");
            }
            Console.Write("], ");
        }
    }
}
}


Javascript




//javascript code for the above approach
function getSubset(set, index) {
  let allSubsets = [];
  
  if (index < 0) {
    let v = [];
    allSubsets.push(v);
  } else {
    allSubsets = getSubset(set, index - 1);
    let item = set[index];
    let moreSubsets = [];
  
    for (let subset of allSubsets) {
      let newSubset = [];
      for (let it of subset)
        newSubset.push(it);
      newSubset.push(item);
      moreSubsets.push(newSubset);
    }
  
    for (let it of moreSubsets)
      allSubsets.push(it);
  }
    
  return allSubsets;
}
  
let set = ["a", "b", "c"];
let index = set.length - 1;
let result = getSubset(set, index);
  
for (let it of result) {
  console.log(" [ " + it.join(",") + " ],");
}


Output

[[], [a], [b], [a, b], , [a, c], [b, c], [a, b, c]]

Time Complexity: O(n*2n)
Auxiliary Space: O(n), For recursive call stack



Recursive program to generate power set

Given a set represented as a string, write a recursive code to print all subsets of it. The subsets can be printed in any order. 

Examples:  

Input :  set = “abc”
Output : { “”, “a”, “b”, “c”, “ab”, “ac”, “bc”, “abc”}

Input : set = “abcd”
Output : { “”, “a” ,”ab” ,”abc” ,”abcd”, “abd” ,”ac” ,”acd”, “ad” ,”b”, “bc” ,”bcd” ,”bd” ,”c” ,”cd” ,”d” }

Similar Reads

Recursive program to generate power set using Backtracking:

The idea is to fix a prefix, and generate all subsets beginning with the current prefix. After all subsets with a prefix are generated, replace the last character with one of the remaining characters....

Recursive program to generate power set using Recursion:

...

Recursive program to generate power set using Backtracking using Bottom Up Approach:

...