每日1题-3

//最开始想到的方法肯定是暴力解法 两层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; //顺序不同也算不同答案
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值