Problem: 2306. 公司命名
class Solution {
public long distinctNames(String[] ideas) {
// 创建一个大小为26的HashSet数组,用于存储每个首字母对应的字符串集合
Set<String>[] groups = new HashSet[26];
Arrays.setAll(groups, i -> new HashSet<>());
long ans = 0; // 初始化答案计数器
// 遍历字符串数组,将每个字符串按首字母分类存储到对应的HashSet中
for (String s : ideas) {
groups[s.charAt(0) - 'a'].add(s.substring(1));
}
// 遍历所有可能的首字母组合(a和b),a > b
for (int a = 1; a < 26; a++) {
for (int b = 0; b < a; b++) {
int m = 0; // 初始化交集计数器
// 计算两个首字母集合的交集大小
for (String s : groups[a]) {
if (groups[b].contains(s))
m++;
}
// 计算可以交换首字母的字符串对数量
// (a集合中非交集部分的大小) * (b集合中非交集部分的大小)
ans += (long) (groups[a].size() - m) * (groups[b].size() - m);
}
}
// 由于每对字符串可以以两种方式交换(ab和ba),所以最终答案乘以2
return ans * 2;
}
}