Total length of string from given Array of strings composed using given characters
Last Updated :
31 Oct, 2021
Given a list of characters and an array of strings, find the total length of all strings in the array of strings that can be composed using the given characters.
Examples:
Input: string = [“mouse”, “me”, “bat”, “lion”], chars = “eusamotb”
Output: 10
Explanation:
The strings that can be formed using the characters “eusamotb” are “mouse” and “me” and “bat”.
Length of “mouse” is 5, length of “me” is 2, and length of “bat” is 3
Sum of all lengths = 5 + 2 + 3 = 10.
Input: string = [“hi”, “data”, “geeksforgeeks”], chars = “tiadha”
Output: 6
Explanation:
The strings that can be formed using the characters “tiadha” are “hi” and “data”. Where length of “hi” is 2, length of “data” is 4, the sum of all is 2 + 4 = 6.
Approach:
To solve the problem mentioned above we have to follow the steps given below:
- We can use characters from the given character string that is ‘chars’ while forming a string. We can also reuse the used characters for forming the next string
- Maintain an unordered map with character as a key and the value by keeping track of the frequency of each character from the string of chars.
- Every time we scan characters from the list of string we reduce the frequency of character from the unordered map but we have to maintain the copy of the original map so as to check the second string .
- If the key is not present in the map it creates one with default value as zero rather than throwing an error.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int countCharacters(
vector<string>& strings,
string chars)
{
int res = 0;
unordered_map< char , int > freq;
for ( int i = 0; i < chars.length(); i++)
freq[chars[i]] += 1;
for ( auto st : strings) {
bool flag = true ;
for ( auto c : st) {
if (!freq) {
flag = false ;
break ;
}
}
if (flag)
res += st.length();
}
return res;
}
int main()
{
vector<string> strings
= { "hi" , "data" ,
"geeksforgeeks" };
string chars = "tiadhae" ;
cout << countCharacters(strings, chars);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int countCharacters(List<String> strings,
String chars)
{
int res = 0 ;
Map<Character, Integer> freq = new HashMap<>();
for ( int i = 0 ; i < chars.length(); i++)
{
freq.put(chars.charAt(i),
freq.getOrDefault(chars.charAt(i), 0 ) + 1 );
}
for (String st : strings)
{
boolean flag = true ;
for ( char c : st.toCharArray())
{
if (!freq.containsKey(c))
{
flag = false ;
break ;
}
}
if (flag)
res += st.length();
}
return res;
}
public static void main(String[] args)
{
List<String> strings = Arrays.asList( "hi" , "data" ,
"geeksforgeeks" );
String chars = "tiadhae" ;
System.out.println(countCharacters(strings, chars));
}
}
|
Python3
def countCharacters(arr, chars):
res = 0
freq = dict ()
for i in range ( len (chars)):
freq[chars[i]] = freq.get(chars[i], 0 ) + 1
for st in arr:
flag = True
for c in st:
if (c not in freq):
flag = False
break
if (flag):
res + = len (st)
return res
if __name__ = = '__main__' :
arr = [ "hi" , "data" , "geeksforgeeks" ]
chars = "tiadhae"
print (countCharacters(arr, chars))
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class GFG{
static int countCharacters(List< string > strings,
string chars)
{
int res = 0;
Dictionary< char ,
int > freq = new Dictionary< char ,
int >();
for ( int i = 0; i < chars.Length; i++)
{
if (freq.ContainsKey(chars[i]))
{
freq[chars[i]]++;
}
else
{
freq.Add(chars[i],
freq.GetValueOrDefault(
chars[i], 0) + 1);
}
}
foreach ( string st in strings)
{
bool flag = true ;
foreach ( char c in st.ToCharArray())
{
if (!freq.ContainsKey(c))
{
flag = false ;
break ;
}
}
if (flag)
res += st.Length;
}
return res;
}
public static void Main( string [] args)
{
string []tmp = { "hi" , "data" ,
"geeksforgeeks" };
List< string > strings = tmp.ToList();
string chars = "tiadhae" ;
Console.Write(countCharacters(strings, chars));
}
}
|
Javascript
<script>
function countCharacters( strings, chars)
{
var res = 0;
var freq = new Map();
for ( var i = 0; i < chars.length; i++)
{
if (freq.has(chars[i]))
freq.set(chars[i], freq.get(chars[i])+1)
else
freq.set(chars[i], 1)
}
strings.forEach(st => {
var flag = true ;
st.split( '' ).forEach(c => {
if (!freq.has(c)) {
flag = false ;
}
});
if (flag)
res += st.length;
});
return res;
}
var strings
= [ "hi" , "data" ,
"geeksforgeeks" ];
var chars = "tiadhae" ;
document.write( countCharacters(strings, chars));
</script>
|
Time Complexity: O(n * m), where n is the length of the char and m is the length of the string.
Auxiliary Space Complexity: O(1), as the unordered map will be of size 26 only.
Share your thoughts in the comments
Please Login to comment...