Maximize length of the String by concatenating characters from an Array of Strings
Last Updated :
22 Mar, 2023
Find the largest possible string of distinct characters formed using a combination of given strings. Any given string has to be chosen completely or not to be chosen at all.
Examples:
Input: strings ="abcd", "efgh", "efgh"
Output: 8
Explanation:
All possible combinations are {"", "abcd", "efgh", "abcdefgh"}.
Therefore, maximum length possible is 8.
Input: strings = "123467890"
Output: 10
Explanation:
All possible combinations are: "", "1234567890".
Therefore, the maximum length possible is 10.
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 <bits/stdc++.h>
using namespace std;
// Function to check if all the
// string characters are unique
bool check(string s)
{
set<char> a;
// Check for repetition in
// characters
for (auto i : s) {
if (a.count(i))
return false;
a.insert(i);
}
return true;
}
// Function to generate all possible strings
// from the given array
vector<string> helper(vector<string>& arr,
int ind)
{
// Base case
if (ind == arr.size())
return { "" };
// Consider every string as
// a starting substring and
// store the generated string
vector<string> tmp
= helper(arr, ind + 1);
vector<string> 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<string>& arr)
{
vector<string> 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<string> 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<Character> a = new HashSet<>();
// Check for repetition 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<String> helper(ArrayList<String> arr,
int ind)
{
ArrayList<String> 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<String> tmp = helper(arr, ind + 1);
ArrayList<String> 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<String> arr)
{
ArrayList<String> 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<String> 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 repetition in
# characters
for i in s:
if i in a:
return False
a.add(i)
return True
# Function 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 repetition in
// characters
for(int i = 0; i < s.Length; i++)
{
if (a.Contains(s[i]))
{
return false;
}
a.Add(s[i]);
}
return true;
}
// Function 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
JavaScript
<script>
// Javascript program to implement the above approach
// Function to check if all the
// string characters are unique
function check(s)
{
let a = new Set();
// Check for repetition in
// characters
for(let i = 0; i < s.length; i++)
{
if (a.has(s[i]))
{
return false;
}
a.add(s[i]);
}
return true;
}
// Function to generate all possible
// strings from the given array
function helper(arr, ind)
{
let fin = [];
fin.push("");
// Base case
if (ind == arr.length)
return fin;
// Consider every string as
// a starting substring and
// store the generated string
let tmp = helper(arr, ind + 1);
let ret = tmp;
// Add current string to result of
// other strings and check if
// characters are unique or not
for(let i = 0; i < tmp.length; i++)
{
let test = tmp[i] + arr[ind];
if (check(test))
ret.push(test);
}
return ret;
}
// Function to find the maximum
// possible length of a string
function maxLength(arr)
{
let tmp = helper(arr, 0);
let len = 0;
// Return max length possible
for(let i = 0; i < tmp.length; i++)
{
len = len > tmp[i].length ? len : tmp[i].length;
}
// Return the answer
return len;
}
let s = [];
s.push("abcdefgh");
document.write(maxLength(s));
// This code is contributed by suresh07.
</script>
Time Complexity: O(2N)
Auxiliary Space: O(N * 2N)
Efficient Approach (Using Dynamic Programming):
C++
#include <bits/stdc++.h>
using namespace std;
int maxLength(vector<string>& A)
{
vector<bitset<26> > dp
= { bitset<26>() }; // auxiliary dp storage
int res = 0; // will store number of unique chars in
// resultant string
for (auto& s : A) {
bitset<26> a; // used to track unique chars
for (char c : s)
a.set(c - 'a');
int n = a.count();
if (n < s.size())
continue; // duplicate chars in current string
for (int i = dp.size() - 1; i >= 0; --i) {
bitset<26> c = dp[i];
if ((c & a).any())
continue; // if 1 or more char common
dp.push_back(c | a); // valid concatenation
res = max(res, (int)c.count() + n);
}
}
return res;
}
int main()
{
vector<string> v = { "ab", "cd", "ab" };
int ans = maxLength(v);
cout << ans; // resultant answer string : cfbdghzest
return 0;
}
Java
import java.util.*;
public class Main {
public static int maxLength(String[] A)
{
List<Set<Character> > dp
= new ArrayList<>(Arrays.asList(
new HashSet<>())); // auxiliary dp storage
int res = 0; // will store number of unique chars in
// resultant string
for (String s : A) {
Set<Character> a = new HashSet<>();
for (char c : s.toCharArray())
a.add(c);
if (a.size() < s.length())
continue; // duplicate chars in current
// string
for (int i = dp.size() - 1; i >= 0; --i) {
Set<Character> c = new HashSet<>(dp.get(i));
if (!Collections.disjoint(a, c))
continue; // if 1 or more char common
dp.add(new HashSet<>(c));
dp.get(dp.size() - 1)
.addAll(a); // valid concatenation
res = Math.max(res, c.size() + a.size());
}
}
return res;
}
public static void main(String[] args)
{
String[] v = { "ab", "cd", "ab" };
int ans = maxLength(v);
System.out.println(
ans); // resultant answer string : cfbdghzest
}
}
Python3
# Python program to implement the above approach
def maxLength(A):
# Initialize an empty list to store bitsets (each representing a unique set of characters)
# We start with an empty bitset, so that we can use it to compare with the incoming bitsets
dp = [set()] # auxiliary dp storage
res = 0 # will store number of unique chars in
# resultant string
for s in A:
a = set(s) # used to track unique chars
if len(a) < len(s):
continue # duplicate chars in current string
for i in range(len(dp)-1, -1, -1):
c = dp[i]
if a & c:
continue # if 1 or more char common
dp.append(c | a) # valid concatenation
res = max(res, len(c) + len(a))
return res
v = ["ab", "cd", "ab"]
ans = maxLength(v)
print(ans)
# Contributed by adityasha4x71
JavaScript
// javascript code implemementation
function maxLength(A)
{
let dp = new Array(26);
for(let i = 0; i < 26; i++){
dp[i] = new Array(26).fill(0); // auxiliary dp storage
}
let res = 0; // will store number of unique chars in
// resultant string
for(let i = 0; i < A.length; i++){
let s = A[i];
let a = [];
for(let j = 0; j < s.length; j++){
a[s[j].charCodeAt(0) - 97] = "1";
}
let n = 0;
for(let j = 0; j < a.length; j++){
if(a[j] == "1") n = n + 1;
}
if(n < s.length) continue; // duplicate chars in current string
for (let j = dp.length - 1; j >= 0; --j) {
let c = dp[j];
for(let k = 0; k < 26; k++){
if(c[k] == "1" && a[k] == "1") continue; // if 1 or more char common
}
let temp = "";
for(let k = 0; k < 26; k++){
if(c[k] == "1" || a[k] == "1") temp = temp + "1";
else temp = temp + "0";
}
dp.push(temp); // valid concatenation
let c_count = 0;
for(let k = 0; k < 26; k++){
if(c[k] == "1") c_count++;
}
res = Math.max(res, c_count + n-2);
}
}
return res;
}
let v = [ "ab", "cd", "ab" ];
let ans = maxLength(v);
console.log(ans); // resultant answer string : cfbdghzest
// The code is contributed by Arushi Jindal.
C#
// C# code implemementation
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class HelloWorld {
public static int maxLength(string[] A)
{
List<string> dp = new List<string> ();
for(int i = 0; i < 26; i++){
string temp = "";
for(int j = 0; j < 26; j++){
temp = temp + "0";
}
dp.Add(temp);
}
int res = 0; // will store number of unique chars in
// resultant string
for(int i = 0; i < A.Length; i++){
string s = A[i];
List<char> a = new List<char>();
for(int indx = 0; indx < 26; indx++){
a.Add('0');
}
for(int j = 0; j < s.Length; j++){
a[System.Convert.ToInt32(s[j]) - 97] = '1';
}
int n = 0;
for(int j = 0; j < a.Count; j++){
if(a[j] == '1') n = n + 1;
}
if(n < s.Length) continue; // duplicate chars in current string
for (int j = dp.Count - 1; j >= 0; --j) {
string c = dp[j];
for(int k = 0; k < 26; k++){
if(c[k] == '1' && a[k] == '1') continue; // if 1 or more char common
}
string temp = "";
for(int k = 0; k < 26; k++){
if(c[k] == '1' || a[k] == '1') temp = temp + "1";
else temp = temp + "0";
}
dp.Add(temp); // valid concatenation
int c_count = 0;
for(int k = 0; k < 26; k++){
if(c[k] == '1') c_count++;
}
res = Math.Max(res, c_count + n-2);
}
}
return res;
}
static void Main() {
string[] v = {"ab", "cd", "ab"};
int ans = maxLength(v);
Console.WriteLine(ans); // resultant answer string : cfbdghzest
}
}
// The code is contributed by Nidhi goel.
Time Complexity: O(N^2)
Auxiliary Space: O(N * 26)
Similar Reads
Longest palindromic string possible by concatenating strings from a given array Given an array of strings S[] consisting of N distinct strings of length M. The task is to generate the longest possible palindromic string by concatenating some strings from the given array. Examples: Input: N = 4, M = 3, S[] = {"omg", "bbb", "ffd", "gmo"}Output: omgbbbgmoExplanation: Strings "omg"
8 min read
Maximum sum of lengths of a pair of strings with no common characters from a given array Given an array arr[] consisting of N strings, the task is to find the maximum sum of length of the strings arr[i] and arr[j] for all unique pairs (i, j), where the strings arr[i] and arr[j] contains no common characters. Examples: Input: arr[] = ["abcd", "cat", "lto", "car", "wxyz", "abcdef"]Output:
7 min read
Maximize product of lengths of strings having no common characters Given an array arr[] consisting of N strings, the task is to find the maximum product of the length of the strings arr[i] and arr[j] for all unique pairs (i, j), where the strings arr[i] and arr[j] contain no common characters. Examples: Input: arr[] = {"abcw", "baz", "foo", "bar", "xtfn", "abcdef"}
12 min read
Length of the smallest sub-string consisting of maximum distinct characters Given a string of length N, find the length of the smallest sub-string consisting of maximum distinct characters. Note : Our output can have same character. Examples: Input : "AABBBCBB"Output : 5Input : "AABBBCBBAC"Output : 3Explanation : Sub-string -> "BAC"Input : "GEEKSGEEKSFOR"Output : 8Explan
15+ min read
Print all strings of maximum length from an array of strings Given an array of strings arr[], the task is to print all the strings of maximum length from the given array. Example: Input: arr[] = {âabaâ, âaaâ, âadâ, âvcdâ, âabaâ}Output: aba vcd abaExplanation:Maximum length among all the strings from the given array is 3.The strings having length equal to 3 fr
7 min read
Maximum length of string formed by concatenation having even frequency of each character Given N strings, print the maximum length of the string and the string formed by concatenating any of the N strings, such that every letter in the string occurs even number of times Example: Input: N = 5, str = ["ABAB", "ABF", "CDA", "AD", "CCC"]Output: ABABCDAADCCC 12Explanation: The string formed
7 min read
Maximize cost of forming a set of words using given set of characters Given an array arr[] consisting of N strings, an array letter[] consisting of M lowercase characters, and an array score[] such that score[i] is the cost of ith English alphabets, the task is to find the maximum cost of any valid set of words formed by using the given letters such that each letter c
15+ min read
Lengths of maximized partitions of a string such that each character of the string appears in one substring Given string str of lowercase alphabets, split the given string into as many substrings as possible such that each character from the given string appears in a single substring. The task is to print the length of all such partitions. Examples: Input: str = "acbbcc"Output: 1 5Explanation:Possible par
8 min read
Maximize count of non overlapping substrings which contains all occurrences of its characters Given string str consisting of lowercase letters, the task is to find the maximum number of non-overlapping substrings such that each substring contains all occurrences of its characters from the entire string. If multiple solutions with the same number of substrings exist, then print the one with t
12 min read
Maximum number of times a given string needs to be concatenated to form a substring of another string Given two strings S1 and S2 of length N and M respectively, the task is to find the maximum value of times the string S2 needs to be concatenated, such that it is a substring of the string S1. Examples: Input: S1 = "ababc", S2 = "ab"Output: 2Explanation: After concatenating S2 exactly twice, the str
12 min read