Naming a Company

Updated on 14 July, 2025
Naming a Company header image

Problem Statement

In this challenge, you're provided with an array of strings, known as ideas. Each string represents a potential name for a new company. The objective is to generate a list of valid company names following specific rules. To do so, you will:

  1. Select two distinct names from the ideas array, namely ideaA and ideaB.
  2. Swap the first letters of ideaA and ideaB.
  3. After the swap:
    • If both new names are absent in the original list of ideas, then the concatenated form ideaA ideaB is considered a valid company name.
  4. You need to return the count of all such unique valid company names derived from different combinations of name pairs from the list.

The goal here is to determine how many unique, valid company names can be generated by following the described process.

Examples

Example 1

Input:

ideas = ["coffee","donuts","time","toffee"]

Output:

6

Explanation:

The following selections are valid:
- ("coffee", "donuts"): The company name created is "doffee conuts".
- ("donuts", "coffee"): The company name created is "conuts doffee".
- ("donuts", "time"): The company name created is "tonuts dime".
- ("donuts", "toffee"): The company name created is "tonuts doffee".
- ("time", "donuts"): The company name created is "dime tonuts".
- ("toffee", "donuts"): The company name created is "doffee tonuts".
Therefore, there are a total of 6 distinct company names.
The following are some examples of invalid selections:
- ("coffee", "time"): The name "toffee" formed after swapping already exists in the original array.
- ("time", "toffee"): Both names are still the same after swapping and exist in the original array.
- ("coffee", "toffee"): Both names formed after swapping already exist in the original array.

Example 2

Input:

ideas = ["lack","back"]

Output:

0

Explanation:

There are no valid selections. Therefore, 0 is returned.

Constraints

  • 2 <= ideas.length <= 5 * 104
  • 1 <= ideas[i].length <= 10
  • ideas[i] consists of lowercase English letters.
  • All the strings in ideas are unique.

Approach and Intuition

The problem involves generating valid names by swapping the initial characters of selected string pairs and then checking if the newly formed names do not already exist in the original list. Here's a logical approach:

  • Generation of New Names:

    • For every pair of names (ideaA, ideaB) in ideas, swap their first letters to create two new names.
    • Form a new possible company name by concatenating these names with a space, i.e., newIdeaA newIdeaB.
  • Validation of New Names:

    • Check if newIdeaA and newIdeaB both do not exist in the ideas array.
  • Ensuring Uniqueness:

    • Use a set to store unique valid company names to ensure there are no duplicates.
  • Result Computation:

    • The final answer would be the size of the set which contains all the distinct valid names generated.

To efficiently check for the existence of newIdeaA and newIdeaB in the ideas list and avoid a naive O(n) search for each name generation, you can use a hash set (or similar data structure) that allows O(1) average time complexity for look-up operations. The preliminary task would be populating this hash set with all names from the ideas list.

By iterating through all possible distinct pairs, swapping their first letters, generating new names, and checking these against the pre-populated hash set, you can build up a list of valid company names. The number of elements in this list (or set) will give you the desired count of unique valid names. This method ensures that all constraints are respected, including the uniqueness of names and the correct formation of valid pairs.

Solutions

  • C++
cpp
class Solution {
public:
    long long calculateDistinctNames(vector<string>& ideas) {
        unordered_set<string> suffixGroups[26];
        for (const auto& idea : ideas)
            suffixGroups[idea[0] - 'a'].insert(idea.substr(1));
            
        long long totalDistinct = 0;
        for (int first = 0; first < 25; ++first) {
            for (int second = first + 1; second < 26; ++second) {
                int sharedSuffixCount = 0;
                for (const auto& suffix : suffixGroups[first]) {
                    if (suffixGroups[second].find(suffix) != suffixGroups[second].end()) {
                        sharedSuffixCount++;
                    }
                }
    
                totalDistinct += 2LL * (suffixGroups[first].size() - sharedSuffixCount) * (suffixGroups[second].size() - sharedSuffixCount);
            }
        }
        return totalDistinct;
    }
};

The problem Naming a Company involves determining the number of distinct names that can be generated from a given set of initial ideas by swapping their first characters. The solution employs C++ and utlilizes a combination of vectors and unordered sets for efficient data manipulation.

The approach is as follows:

  • Initialize 26 unordered sets to store unique suffixes grouped by their first character.
  • Iterate through each idea, classify it by its first character and store its suffix into the respective unordered set.
  • To count the potential distinct names, pairs of different groups are compared to determine the number of suffixes they share.
  • For each group pair (first, second), the count of shared suffixes is determined.
  • The total possible distinct combinations for the pair is then calculated by excluding the shared suffixes from each group's total suffix count. Since swapping can be bidirectional, the result is multiplied by two.

Important calculations include:

  • Determining shared suffixes between any two different first character groups.
  • Calculating the potential distinct combinations based on the number of unique suffixes minus shared suffixes for each pair of initial character groups.

The result is obtained by the formula: [ \text{totalDistinct} = 2 \times (\text{size of suffixes in first group} - \text{shared suffix count}) \times (\text{size of suffixes in second group} - \text{shared suffix count}) ]

This algorithm ensures that the calculation remains efficient by avoiding direct comparison of all pair combinations and directly counting shared suffixes to subtract from the total potential combinations.

  • Java
java
class Solution {
    public long calculateDistinctNames(String[] ideas) {
        // Initialize groups for each letter of alphabet.
        HashSet<String>[] groupedByInitial = new HashSet[26];
        for (int index = 0; index < 26; index++) {
            groupedByInitial[index] = new HashSet<>();
        }
        for (String idea : ideas) {
            groupedByInitial[idea.charAt(0) - 'a'].add(idea.substring(1));
        }
    
        // Compute the total number of distinct name combinations.
        long totalDistinct = 0;
        for (int first = 0; first < 25; first++) {
            for (int second = first + 1; second < 26; second++) {
                // Find common suffixes between two groups.
                long sharedSuffixes = 0;
                for (String suffix : groupedByInitial[first]) {
                    if (groupedByInitial[second].contains(suffix)) {
                        sharedSuffixes++;
                    }
                }
    
                // Calculate distinct names based on unique suffixes with permutations.
                totalDistinct += 2 * (groupedByInitial[first].size() - sharedSuffixes) * (groupedByInitial[second].size() - sharedSuffixes);
            }
        }
    
        return totalDistinct;
    }
}

Solve the problem of generating distinct names for a company using Java through this outline of the provided solution. This Java solution categorizes suffixes of provided idea strings by the initial character and then figures out possible unique names by swapping initials.

  • Initialize collections to group suffixes based on the initial character. An array of HashSet is employed to store suffixes assigned to each initial letter from 'a' to 'z', excluding the initial letter itself.
  • Traverse through the provided ideas array, filling each HashSet with suffixes, based on the initial letter of each idea.
  • Use nested loops to compare each pair of sets corresponding to different initials. For each pair of initials, calculate the number of common suffixes.
  • For each pair of distinct initial characters, compute possible unique names by considering all combinations of suffixes, excluding those that are common, and factor in permutations.
  • The multiplication by 2 accounts for swapping the pairs of initial letters, i.e., initial from first group with suffix from second group and vice versa.
  • Sum the outcomes for all combinations to obtain the total number of distinct name possibilities.

By following the above steps, calculate and return the total count of unique company names that can be formed by permutating the initials of available ideas' suffixes. This method pairs efficient hashing with combinatorial logic to handle the creation of distinct names.

  • Python
python
class Solution:
    def uniqueNames(self, ideas: List[str]) -> int:
        # Organize ideas by their first character
        idea_buckets = [set() for _ in range(26)]
        for idea in ideas:
            idea_buckets[ord(idea[0]) - ord('a')].add(idea[1:])
            
        total_combinations = 0
        # Evaluate unique combinations across different buckets
        for i in range(25):
            for j in range(i + 1, 26):
                # Count of common suffixes in the current pair of buckets
                common_suffixes = len(idea_buckets[i] & idea_buckets[j]) 
                    
                # Compute valid combinations by avoiding the common elements
                total_combinations += 2 * (len(idea_buckets[i]) - common_suffixes) * (len(idea_buckets[j]) - common_suffixes)
                    
        return total_combinations

The provided Python code is designed to calculate the number of unique company names that can be formed using a list of idea fragments. The method uniqueNames in the Solution class performs this calculation. Here is a breakdown of how the logic operates:

  • ideas is a list of strings from which unique company names are formed by considering combinations of different prefixes with the same suffixes.
  • Each idea is sorted into 26 buckets based on their first character (from 'a' to 'z'). Only the suffixes (substring starting from the second character of the string) are stored in these buckets.
  • The program then looks for unique combinations by picking suffixes from one bucket and prefixes from another, ensuring the prefixes are different.
  • For each distinct pair of character buckets, it calculates the total number of unique names that can be formed by excluding combinations where both the chosen buckets share the same suffixes.
  • This is scaled by 2 because each combination of characters from two different buckets can form two names (one for each character as the starting letter).

The overall result total_combinations accumulates the count of unique names possible using the above method, which is then returned.

This approach ensures the efficiency of the process by grouping ideas by their first characters and only considering unique combinations across different groups, effectively reducing redundancy and improving computation speed.

Comments

No comments yet.