Print all subsequences of a string using ArrayList

Given a string str, the task is to print all the sub-sequences of str
A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements.
Examples: 
 

Input: str = “abc” 
Output: a b ab c ac bc abc
Input: str = “geek” 
Output: g e ge e ge ee gee k gk ek gek ek gek eek geek 
 

 

Approach: Write a recursive function that prints every sub-sequence of the sub-string starting from the second character str[1, n – 1] after appending the first character of the string str[0] in the beginning of every sub-sequence. Terminating condition will be when the passed string is empty, in that case the function will return an empty arraylist.
Below is the implementation of the above approach:
 

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.ArrayList;
 
public class GFG {
 
    // Utility function to print the contents
    // of the ArrayList
    static void printArrayList(ArrayList<String> arrL)
    {
        arrL.remove("");
        for (int i = 0; i < arrL.size(); i++)
            System.out.print(arrL.get(i) + " ");
    }
 
    // Function to returns the arraylist which contains
    // all the sub-sequences of str
    public static ArrayList<String> getSequence(String str)
    {
 
        // If string is empty
        if (str.length() == 0) {
 
            // Return an empty arraylist
            ArrayList<String> empty = new ArrayList<>();
            empty.add("");
            return empty;
        }
 
        // Take first character of str
        char ch = str.charAt(0);
 
        // Take sub-string starting from the
        // second character
        String subStr = str.substring(1);
 
        // Recurvise call for all the sub-sequences
        // starting from the second character
        ArrayList<String> subSequences =
                              getSequence(subStr);
 
        // Add first character from str in the beginning
        // of every character from the sub-sequences
        // and then store it into the resultant arraylist
        ArrayList<String> res = new ArrayList<>();
        for (String val : subSequences) {
            res.add(val);
            res.add(ch + val);
        }
 
        // Return the resultant arraylist
        return res;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "geek";
        printArrayList(getSequence(str));
        // System.out.print(getSequence(str));
    }
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation of the approach
 
# Utility function to print the contents
# of the ArrayList
def printArrayList(arrL):
    arrL.remove("")
    print(*arrL, sep = " ")
 
# Function to returns the arraylist which contains
# all the sub-sequences of str
def getSequence(Str):
 
    # If string is empty
    if(len(Str) == 0):
 
        # Return an empty arraylist
        empty = []
        empty.append("")
        return empty
 
    # Take first character of str
    ch = Str[0]
 
    # Take sub-string starting from the
    # second character
    subStr = Str[1:]
 
    # Recurvise call for all the sub-sequences
    # starting from the second character
    subSequences = getSequence(subStr)
 
    # Add first character from str in the beginning
    # of every character from the sub-sequences
    # and then store it into the resultant arraylist
    res = []
 
    for val in subSequences:
        res.append(val)
        res.append(ch + val)
 
    # Return the resultant arraylist
    return res
 
# Driver code
Str = "geek"
printArrayList(getSequence(Str))
 
# This code is contributed by avanitrachhadiya2155
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG{
 
    // Utility function to print the contents
    // of the List
    static void printList(List<String> arrL)
    {
        arrL.Remove("");
        for (int i = 0; i < arrL.Count; i++)
            Console.Write(arrL[i] + " ");
    }
 
    // Function to returns the arraylist which contains
    // all the sub-sequences of str
    public static List<String> getSequence(String str)
    {
 
        // If string is empty
        if (str.Length == 0)
        {
 
            // Return an empty arraylist
            List<String> empty = new List<String>();
            empty.Add("");
            return empty;
        }
 
        // Take first character of str
        char ch = str[0];
 
        // Take sub-string starting from the
        // second character
        String subStr = str.Substring(1);
 
        // Recurvise call for all the sub-sequences
        // starting from the second character
        List<String> subSequences = getSequence(subStr);
 
        // Add first character from str in the beginning
        // of every character from the sub-sequences
        // and then store it into the resultant arraylist
        List<String> res = new List<String>();
        foreach (String val in subSequences)
        {
            res.Add(val);
            res.Add(ch + val);
        }
 
        // Return the resultant arraylist
        return res;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String str = "geek";
        printList(getSequence(str));
        // Console.Write(getSequence(str));
    }
}
 
// This code is contributed by Rohit_ranjan
chevron_right

Output: 

g e ge e ge ee gee k gk ek gek ek gek eek geek

 

Alternate Solution: One by one fix characters and recursively generate all subsets starting from them. 
 

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print all the sub-sequences
// of a string
void printSubSeq(string sub, string ans)
{
 
    if (sub.length() == 0) {
        cout << "" << ans << " ";
        return;
    }
 
    // First character of sub
    char ch = sub[0];
 
    // Sub-string starting from second
    // character of sub
    string ros = sub.substr(1);
 
    // Excluding first character
    printSubSeq(ros, ans);
 
    // Including first character
    printSubSeq(ros, ans + ch);
}
 
// Driver code
int main()
{
    string str = "abc";
    printSubSeq(str, "");
 
    return 0;
}
 
// This code is contributed by divyesh072019
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
public class sub_sequence {
 
    // Function to print all the sub-sequences
    // of a string
    public static void printSubSeq(String sub,
                                  String ans)
    {
 
        if (sub.length() == 0) {
            System.out.print("" + ans + " ");
            return;
        }
 
        // First character of sub
        char ch = sub.charAt(0);
 
        // Sub-string starting from second
        // character of sub
        String ros = sub.substring(1);
 
        // Excluding first character
        printSubSeq(ros, ans);
 
        // Including first character
        printSubSeq(ros, ans + ch);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "abc";
        printSubSeq(str, "");
    }
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
 
# Function to print all the sub-sequences
# of a string
def printSubSeq(sub, ans) :
 
    if (len(sub) == 0) :
        print(ans , end = " ")
        return
 
    # First character of sub
    ch = sub[0]
 
    # Sub-string starting from second
    # character of sub
    ros = sub[1 : ]
 
    # Excluding first character
    printSubSeq(ros, ans)
 
    # Including first character
    printSubSeq(ros, ans + ch)
 
Str = "abc"
printSubSeq(Str, "")
 
# This code iscontributed by divyeshrabadiya07
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
 
class GFG
{
 
// Function to print all the 
// sub-sequences of a string
public static void printSubSeq(string sub,
                               string ans)
{
    if (sub.Length == 0)
    {
        Console.Write("" + ans + " ");
        return;
    }
 
    // First character of sub
    char ch = sub[0];
 
    // Sub-string starting from second
    // character of sub
    string ros = sub.Substring(1);
 
    // Excluding first character
    printSubSeq(ros, ans);
 
    // Including first character
    printSubSeq(ros, ans + ch);
}
 
// Driver code
public static void Main()
{
    string str = "abc";
    printSubSeq(str, "") ;
}
}
 
// This code is contributed by Ryuga
chevron_right

Output: 
c b bc a ac ab abc

 




Article Tags :
Practice Tags :