LeetCode 6094. 公司命名(分组+哈希)

文章目录


题目

在这里插入图片描述

在这里插入图片描述

分组 + 哈希

将每个字符串分为ch+sub其中ch是首字符,sub是后缀,然后对所有字符串按照ch分组,得到map<char, set<string>> mpmp[ch]中只记录sub

例如:对于ideas = ["coffee","donuts","time","toffee"]mp['c']={"offee"}mp['t']={"ime","offee"}mp[d]={"onuts"}

然后,对于任意两个分组mp[ch_i]mp[ch_j],这两个分组中的字符串可以拼成的合法的字符串的个数等于(mp[ch_i].size()-cnt)*(mp[ch_j].size()-cnt),其中cntmp[ch_i]mp[ch_j]中相同sub的个数。

class Solution {
    public long distinctNames(String[] ideas) {
        int n = ideas.length;
        long ans = 0;

        HashMap<Integer, Set<String>> map = new HashMap<>();
        for(String s:ideas){
            int ch = s.charAt(0)-'a';
            if(map.containsKey(ch)){
                Set<String> set = map.get(ch);
                set.add(s.substring(1));
            }else{
                Set<String> set = new HashSet<>();
                set.add(s.substring(1));
                map.put(ch, set);
            }
        }

        for (int i = 0; i < 26; i++) {
            if(!map.containsKey(i)){
                continue;
            }
            for (int j = i+1; j < 26; j++) {
                if(!map.containsKey(j)){
                    continue;
                }
                Set<String> seti = map.get(i);
                Set<String> setj = map.get(j);

                int cnt = 0;
                Iterator<String> iterator = seti.iterator();
                while(iterator.hasNext()) {
                    if(setj.contains(iterator.next())){
                        cnt++;
                    }
                }
                ans+=(seti.size()-cnt)*(setj.size()-cnt)*2;
            }
        }

        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值