GeeksforGeeks App
Open App
Browser
Continue

# 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:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `// Utility function to print the contents``// of the List``void` `printList(vector arrL)``{``    ``arrL.erase(find(arrL.begin(), arrL.end(), ``""``));``    ``for` `(``int` `i = 0; i < arrL.size(); i++)``        ``cout << arrL[i] << ``" "``;``}` `// Function to returns the arraylist which contains``// all the sub-sequences of str``vector getSequence(string str)``{` `    ``// If string is empty``    ``if` `(str.length() == 0)``    ``{``        ``// Return an empty arraylist``        ``vector empty;``        ``empty.push_back(``""``);``        ``return` `empty;``    ``}` `    ``// Take first character of str``    ``char` `ch = str[0];` `    ``// Take sub-string starting from the``    ``// second character``    ``string subStr = str.substr(1);` `    ``// Recursive call for all the sub-sequences``    ``// starting from the second character``    ``vector 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``    ``vector res;``    ``for``(string val : subSequences)``    ``{``        ``res.push_back(val);``        ``res.push_back(ch + val);``    ``}` `    ``// Return the resultant arraylist``    ``return` `res;``}``    ` `int` `main()``{``    ``string str = ``"geek"``;``    ``printList(getSequence(str));` `    ``return` `0;``}` `// This code is contributed by rameshtravel07.`

## Java

 `// 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 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 getSequence(String str)``    ``{` `        ``// If string is empty``        ``if` `(str.length() == ``0``) {` `            ``// Return an empty arraylist``            ``ArrayList 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``);` `        ``// Recursive call for all the sub-sequences``        ``// starting from the second character``        ``ArrayList 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 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));``    ``}``}`

## Python3

 `# 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``:]` `    ``# Recursive 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`

## C#

 `// 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 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 getSequence(String str)``    ``{` `        ``// If string is empty``        ``if` `(str.Length == 0)``        ``{` `            ``// Return an empty arraylist``            ``List empty = ``new` `List();``            ``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);` `        ``// Recursive call for all the sub-sequences``        ``// starting from the second character``        ``List 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 res = ``new` `List();``        ``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`

## Javascript

 ``

Output:

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

Time Complexity: O(2^n), where n is the length of the string.

Space Complexity: O(2^n), as the recursive stack grows until the length of the string.

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

## C++

 `// C++ implementation of the approach``#include ``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`

## Java

 `// 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, ``""``);``    ``}``}`

## Python3

 `# 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`

## C#

 `// 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`

## Javascript

 ``

Output:

`c b bc a ac ab abc`

My Personal Notes arrow_drop_up