Description
You are given an array of strings ideas that represents a list of names to be used in the process of naming a company. The process of naming a company is as follows:
- Choose 2 distinct names from
ideas, call themideaAandideaB. - Swap the first letters of
ideaAandideaBwith each other. - If both of the new names are not found in the original
ideas, then the nameideaA ideaB(the concatenation ofideaAandideaB, separated by a space) is a valid company name. - Otherwise, it is not a valid name.
Return the number of distinct valid names for the company.
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 * 1041 <= ideas[i].length <= 10ideas[i]consists of lowercase English letters.- All the strings in
ideasare unique.
Solutions
Solution 1: Enumeration and Counting
We define f[i][j] to represent the number of strings in ideas that start with the i-th letter and, when replaced with the j-th letter, do not exist in ideas. Initially, f[i][j] = 0. Additionally, we use a hash table s to record the strings in ideas, allowing us to quickly determine whether a string is in ideas.
Next, we traverse the strings in ideas. For the current string v, we enumerate the first letter j after replacement. If the string obtained by replacing v is not in ideas, we update f[i][j] = f[i][j] + 1.
Finally, we traverse the strings in ideas again. For the current string v, we enumerate the first letter j after replacement. If the string obtained by replacing v is not in ideas, we update the answer ans = ans + f[j][i].
The final answer is ans.
The time complexity is O(n × m × |Σ|), and the space complexity is O(|Σ|^2). Here, n and m are the number of strings in ideas and the maximum length of the strings, respectively, and |Σ| is the character set of the strings, with |Σ| ≤ 26 in this problem.
class Solution: def distinctNames(self, ideas: List[str]) -> int: s = set(ideas) f = [[0] * 26 for _ in range(26)] for v in ideas: i = ord(v[0]) - ord('a') t = list(v) for j in range(26): t[0] = chr(ord('a') + j) if ''.join(t) not in s: f[i][j] += 1 ans = 0 for v in ideas: i = ord(v[0]) - ord('a') t = list(v) for j in range(26): t[0] = chr(ord('a') + j) if ''.join(t) not in s: ans += f[j][i] return ans(code-box)
