题目
公司命名
思路
- 将所有后缀分成不同的组,利用int 存储每个字母的首字母,状态压缩==> t|=1<<(s[0]-'a');
- 递推,cnt[26][26],i,j,cnt[i][j]表示前面的组中 没有i 有j的个数
- 遍历所有组,如果组中有i字母,而没有j字母既可以增加数值
- 如果组中没有i字母,但是有j字母,可以为后续的组添加不同的次数
代码
class Solution {
public:
long long distinctNames(vector<string> &ideas) {
unordered_map<string, int> group;
for (auto &s : ideas)
group[s.substr(1)] |= 1 << (s[0] - 'a');
long ans = 0L;
int cnt[26][26]; memset(cnt, 0, sizeof(cnt));
for (auto &[_, mask] : group)
for (int i = 0; i < 26; i++)
if ((mask >> i & 1) == 0) {
for (int j = 0; j < 26; j++)
if (mask >> j & 1) ++cnt[i][j];
} else {
for (int j = 0; j < 26; j++)
if ((mask >> j & 1) == 0) ans += cnt[i][j];
}
return ans * 2;
}
};