Given an array of strings, where each string consists of lowercase characters from a to j. You need to find the maximum number of strings that can be concatenated together such that the resulting string can be made out of exactly k distinct characters.
Example:
Input: n = 4, str = [ "abc", "de", "fg", "h"], k = 5
Output: 3
Explanation: The strings de, fg and h would add up to defgh which has exactly 5 distinct characters.
Input: n = 3, str = [ "abcde", "de", "fghi"], k = 5
Output: 2
Explanation: The strings "abcde" and "de" would add up to abcdede which has exactly 5 distinct characters.
Approach: This can be solved with the following idea:
The main idea is to use a bitmask approach. We'll represent each string as a bitmask where each bit corresponds to a character in the alphabet (a to j). If a bit is set, it means the corresponding character is present in the string. By manipulating these bitmasks and using bitwise operations, we can efficiently check if a set of strings can be concatenated to form a string with exactly k distinct characters.
Below are the steps involved:
- Create a map called masks to store bitmasks of all input strings.
- Iterate through each string in the input s and convert it into a bitmask. Set bits in the bitmask based on the characters present in the string.
- Initialize ans to 0. This variable will keep track of the maximum number of concatenated strings that satisfy the condition.
- Iterate through numbers from 0 to 1024 (2^10), representing possible combinations of characters (bitmasks) with up to 10 distinct characters (as there are 10 possible characters from 'a' to 'j').
- For each number in the iteration, check if it has exactly k set bits using the __builtin_popcount function. If it doesn't, move to the next number.
- Initialize temp and tans to 0. The temp will be used to combine bitmasks of strings, and tans will store the count of concatenated strings for the current bitmask.
- Iterate through the masks map and check if the current bitmask includes the bitmask of a string. If it does, set the corresponding bits in temp and add the count of that string to tans.
- Check if temp is equal to the current bitmask. If they match, it means that all required characters are present in the concatenated strings.
- Update ans with the maximum of its current value and tans if the bitmasks match.
- Return the final value of ans, which represents the maximum number of concatenated strings with exactly kdistinct characters.
Below is the implementation of the code:
Time Complexity: O(N)
Auxiliary Space: O(N), Where N is the number of strings present in the array.