题目
分组 + 哈希
将每个字符串分为ch+sub
其中ch
是首字符,sub
是后缀,然后对所有字符串按照ch
分组,得到map<char, set<string>> mp
,mp[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)
,其中cnt
为mp[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;
}
}