Related Articles
Maximize length of the String by concatenating characters from an Array of Strings
• Last Updated : 11 Dec, 2020

Given an array of strings arr[], the task is to find the maximum possible length of a string of distinct characters that can be generated by concatenating of the subsequence of the given array.

Examples:

Input: arr[] = {“ab”, “cd”, “ab”}
Output:
Explanation:
All possible combinations are {“”, “ab”, “cd”, “abcd”, “cdab”}.
Therefore, maximum length possible is 4.

Input: arr[] = {“abcdefgh”}
Output:
Explanation:
All possible combinations are: “”, “abcdefgh”.
Therefore, the maximum length possible is 8.

Approach: The idea is to use Recursion
Follow the steps below to solve the problem:

• Iterate from left to right and consider every string as a possible starting substring.
• Initialize a HashSet to store the distinct characters encountered so far.
• Once a string is selected as starting substring, check for every remaining string, if it only contains characters which have not occurred before. Append this string as a substring to the current string being generated.
• After performing the above steps, print the maximum length of a string that has been generated.

Below is the implementation of the above approach:

## C++

 `// C++ Program to implement``// the above approach``#include ``using` `namespace` `std;` `// Function to check if all the``// string characters are unique``bool` `check(string s)``{` `    ``set<``char``> a;` `    ``// Check for repetation in``    ``// characters``    ``for` `(``auto` `i : s) {``        ``if` `(a.count(i))``            ``return` `false``;``        ``a.insert(i);``    ``}` `    ``return` `true``;``}` `// Funcyion to generate all possible strings``// from the given array``vector helper(vector& arr,``                    ``int` `ind)``{` `    ``// Base case``    ``if` `(ind == arr.size())``        ``return` `{ ``""` `};` `    ``// Consider every string as``    ``// a starting substring and``    ``// store the generated string``    ``vector tmp``        ``= helper(arr, ind + 1);` `    ``vector ret(tmp.begin(),``                    ``tmp.end());` `    ``// Add current string to result of``    ``// other strings and check if``    ``// characters are unique or not``    ``for` `(``auto` `i : tmp) {``        ``string test = i + arr[ind];``        ``if` `(check(test))``            ``ret.push_back(test);``    ``}` `    ``return` `ret;``}` `// Function to find the maximum``// possible length of a string``int` `maxLength(vector& arr)``{``    ``vector tmp = helper(arr, 0);` `    ``int` `len = 0;` `    ``// Return max length possible``    ``for` `(``auto` `i : tmp) {``        ``len = len > i.size()``                ``? len``                ``: i.size();``    ``}` `    ``// Return the answer``    ``return` `len;``}` `// Driver Code``int` `main()``{``    ``vector s;``    ``s.push_back(``"abcdefgh"``);` `    ``cout << maxLength(s);` `    ``return` `0;``}`

## Java

 `// Java program to implement ``// the above approach``import` `java.util.*;``import` `java.lang.*;` `class` `GFG{` `// Function to check if all the``// string characters are unique``static` `boolean` `check(String s)``{``    ``HashSet a = ``new` `HashSet<>();``    ` `    ``// Check for repetation in``    ``// characters``    ``for``(``int` `i = ``0``; i < s.length(); i++)``    ``{``        ``if` `(a.contains(s.charAt(i)))``        ``{``            ``return` `false``;``        ``}``        ``a.add(s.charAt(i));``    ``}``    ``return` `true``;``}` `// Function to generate all possible``//  strings from the given array``static` `ArrayList helper(ArrayList arr,``                                ``int` `ind)``{``    ``ArrayList fin = ``new` `ArrayList<>();``    ``fin.add(``""``);``      ` `    ``// Base case``    ``if` `(ind == arr.size() )``        ``return` `fin;``    ` `    ``// Consider every string as``    ``// a starting substring and``    ``// store the generated string``    ``ArrayList tmp = helper(arr, ind + ``1``);``    ` `    ``ArrayList ret = ``new` `ArrayList<>(tmp);``    ` `    ``// Add current string to result of``    ``// other strings and check if``    ``// characters are unique or not``    ``for``(``int` `i = ``0``; i < tmp.size(); i++)``    ``{``        ``String test = tmp.get(i) +``                      ``arr.get(ind);``                        ` `        ``if` `(check(test))``            ``ret.add(test);``    ``}``    ``return` `ret;``}` `// Function to find the maximum``// possible length of a string``static` `int` `maxLength(ArrayList arr)``{``    ``ArrayList tmp = helper(arr, ``0``);``    ` `    ``int` `len = ``0``;``    ` `    ``// Return max length possible``    ``for``(``int` `i = ``0``; i < tmp.size(); i++)``    ``{``        ``len = len > tmp.get(i).length() ? len : ``                    ``tmp.get(i).length();``    ``}``      ` `    ``// Return the answer``    ``return` `len;``}` `// Driver code``public` `static` `void` `main (String[] args)``{``    ``ArrayList s = ``new` `ArrayList<>();``    ``s.add(``"abcdefgh"``);``    ` `    ``System.out.println(maxLength(s));``}``}` `// This code is contributed by offbeat`

## Python3

 `# Python3 program to implement``# the above approach`` ` `# Function to check if all the``# string characters are unique``def` `check(s):``    ` `    ``a ``=` `set``()`` ` `    ``# Check for repetation in``    ``# characters``    ``for` `i ``in` `s:``        ``if` `i ``in` `a:``            ``return` `False``            ` `        ``a.add(i)`` ` `    ``return` `True`` ` `# Funcyion to generate all possible``# strings from the given array``def` `helper(arr, ind):`` ` `    ``# Base case``    ``if` `(ind ``=``=` `len``(arr)):``        ``return` `[""]`` ` `    ``# Consider every string as``    ``# a starting substring and``    ``# store the generated string``    ``tmp ``=` `helper(arr, ind ``+` `1``)`` ` `    ``ret ``=` `tmp`` ` `    ``# Add current string to result of``    ``# other strings and check if``    ``# characters are unique or not``    ``for` `i ``in` `tmp:``        ``test ``=` `i ``+` `arr[ind]``        ` `        ``if` `(check(test)):``            ``ret.append(test)`` ` `    ``return` `ret``    ` `# Function to find the maximum``# possible length of a string``def` `maxLength(arr):` `    ``tmp ``=` `helper(arr, ``0``)`` ` `    ``l ``=` `0`` ` `    ``# Return max length possible``    ``for` `i ``in` `tmp:``        ``l ``=` `l ``if` `l > ``len``(i) ``else` `len``(i)`` ` `    ``# Return the answer``    ``return` `l` `# Driver Code``if` `__name__``=``=``'__main__'``:``    ` `    ``s ``=` `[]``    ``s.append(``"abcdefgh"``)`` ` `    ``print``(maxLength(s))`` ` `# This code is contributed by pratham76`

## C#

 `// C# program to implement``// the above approach``using` `System;``using` `System.Collections;``using` `System.Collections.Generic;``using` `System.Text;` `class` `GFG{``    ` `// Function to check if all the``// string characters are unique``static` `bool` `check(``string` `s)``{` `    ``HashSet<``char``> a = ``new` `HashSet<``char``>();` `    ``// Check for repetation in``    ``// characters``    ``for``(``int` `i = 0; i < s.Length; i++)``    ``{``        ``if` `(a.Contains(s[i]))``        ``{``            ``return` `false``;``        ``}``        ``a.Add(s[i]);``    ``}``    ``return` `true``;``}` `// Funcyion to generate all possible``// strings from the given array``static` `ArrayList helper(ArrayList arr,``                        ``int` `ind)``{``    ` `    ``// Base case``    ``if` `(ind == arr.Count)``        ``return` `new` `ArrayList(){``""``};` `    ``// Consider every string as``    ``// a starting substring and``    ``// store the generated string``    ``ArrayList tmp = helper(arr, ind + 1);` `    ``ArrayList ret = ``new` `ArrayList(tmp);` `    ``// Add current string to result of``    ``// other strings and check if``    ``// characters are unique or not``    ``for``(``int` `i = 0; i < tmp.Count; i++)``    ``{``        ``string` `test = (``string``)tmp[i] +``                    ``(``string``)arr[ind];``                        ` `        ``if` `(check(test))``            ``ret.Add(test);``    ``}``    ``return` `ret;``}` `// Function to find the maximum``// possible length of a string``static` `int` `maxLength(ArrayList arr)``{``    ``ArrayList tmp = helper(arr, 0);` `    ``int` `len = 0;` `    ``// Return max length possible``    ``for``(``int` `i = 0; i < tmp.Count; i++)``    ``{``        ``len = len > ((``string``)tmp[i]).Length ? len :``                    ``((``string``)tmp[i]).Length;``    ``}``    ` `    ``// Return the answer``    ``return` `len;``}``    ` `// Driver Code``public` `static` `void` `Main(``string``[] args)``{``    ``ArrayList s = ``new` `ArrayList();``    ``s.Add(``"abcdefgh"``);` `    ``Console.Write(maxLength(s));``}``}` `// This code is contributed by rutvik_56`
Output:
`8`

Time Complexity: O(2N
Auxiliary Space: O(N * 2N)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up