//最开始想到的方法肯定是暴力解法 两层for循环遍历去试每一种情况 但是我放弃这个想法太麻烦了
//研究题目 说是交换首字母 然后交换过后字符串如果在ideas里面出现过(set很好用)也可以直接找有多少个相同的后缀
//说明就是不符合的 就相当于我们可以看后缀判断
//我们可以尝试分组 把首字母相同的放在一个组里 然后比较不同组里面有没有后缀相同的字符串 相当于求交集
//相同首字母放入组里 要去掉首字母这样方便我们匹配到后缀相同的字符串 剩下就可以用数学知识解决
class Solution {
public:
long long distinctNames(vector<string>& ideas) {
unordered_set<string> groups[26];
for(string idea : ideas){
groups[idea[0]-'a'].insert(idea.substr(1));
}
long long ans=0;
//枚举所有的集合
for(int i=1;i<26;i++){
for(int j=0;j<i;j++){
int m=0; //求交集数量
//直接在J集合里面找找有几个相同的后缀
for (string idea : groups[i]) {
m += groups[j].count(idea);
}
ans+=(long long)(groups[i].size()-m) * (groups[j].size()-m);
}
}
return ans * 2; //顺序不同也算不同答案
}
};
每日1题-3
最新推荐文章于 2024-09-27 14:28:55 发布