2306. 公司命名
题目描述
给你一个字符串数组 ideas
表示在公司命名过程中使用的名字列表。公司命名流程如下:
- 从
ideas
中选择 2 个 不同 名字,称为ideaA
和ideaB
。 - 交换
ideaA
和ideaB
的首字母。 - 如果得到的两个新名字 都 不在
ideas
中,那么ideaA ideaB
(串联ideaA
和ideaB
,中间用一个空格分隔)是一个有效的公司名字。 - 否则,不是一个有效的名字。
返回 不同 且有效的公司名字的数目。
示例 1:
输入:ideas = ["coffee","donuts","time","toffee"] 输出:6 解释:下面列出一些有效的选择方案: - ("coffee", "donuts"):对应的公司名字是 "doffee conuts" 。 - ("donuts", "coffee"):对应的公司名字是 "conuts doffee" 。 - ("donuts", "time"):对应的公司名字是 "tonuts dime" 。 - ("donuts", "toffee"):对应的公司名字是 "tonuts doffee" 。 - ("time", "donuts"):对应的公司名字是 "dime tonuts" 。 - ("toffee", "donuts"):对应的公司名字是 "doffee tonuts" 。 因此,总共有 6 个不同的公司名字。 下面列出一些无效的选择方案: - ("coffee", "time"):在原数组中存在交换后形成的名字 "toffee" 。 - ("time", "toffee"):在原数组中存在交换后形成的两个名字。 - ("coffee", "toffee"):在原数组中存在交换后形成的两个名字。
示例 2:
输入:ideas = ["lack","back"] 输出:0 解释:不存在有效的选择方案。因此,返回 0 。
提示:
2 <= ideas.length <= 5 * 104
1 <= ideas[i].length <= 10
ideas[i]
由小写英文字母组成ideas
中的所有字符串 互不相同
解法
方法一:枚举计数
我们定义 \(f[i][j]\) 表示 \(\textit{ideas}\) 中以第 \(i\) 个字母开头,替换为第 \(j\) 个字母后,不在 \(\textit{ideas}\) 中的字符串的个数。初始时 \(f[i][j] = 0\)。另外,用一个哈希表 \(s\) 记录 \(\textit{ideas}\) 中的字符串,方便我们快速判断某个字符串是否在 \(\textit{ideas}\) 中。
接下来,我们遍历 \(\textit{ideas}\) 中字符串,对于当前遍历到的字符串 \(v\),我们枚举替换后的第一个字母 \(j\),如果 \(v\) 替换后的字符串不在 \(\textit{ideas}\) 中,那么我们就更新 \(f[i][j] = f[i][j] + 1\)。
最后,我们再次遍历 \(\textit{ideas}\) 中字符串,对于当前遍历到的字符串 \(v\),我们枚举替换后的第一个字母 \(j\),如果 \(v\) 替换后的字符串不在 \(\textit{ideas}\) 中,那么我们就更新答案 \(\textit{ans} = \textit{ans} + f[j][i]\)。
最终答案即为 \(\textit{ans}\)。
时间复杂度 \(O(n \times m \times |\Sigma|)\),空间复杂度 \(O(|\Sigma|^2)\)。其中 \(n\) 和 \(m\) 分别是 \(\textit{ideas}\) 中字符串的个数和字符串的最大长度,而 \(|\Sigma|\) 是字符串中出现的字符集,本题中 \(|\Sigma| \leq 26\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|