一个网站域名,如"discuss.leetcode.com",包含了多个子域名。作为顶级域名,常用的有"com",下一级则有"leetcode.com",最低的一级为"discuss.leetcode.com"。当我们访问域名"discuss.leetcode.com"时,也同时访问了其父域名"leetcode.com"以及顶级域名 “com”。
给定一个带访问次数和域名的组合,要求分别计算每个域名被访问的次数。其格式为访问次数+空格+地址,例如:“9001 discuss.leetcode.com”。
接下来会给出一组访问次数和域名组合的列表cpdomains 。要求解析出所有域名的访问次数,输出格式和输入格式相同,不限定先后顺序。
哈希映射
对于一个包含.的域名x.y,我们需要统计的是x.y和y;对于两个包含.的域名a.b.c,我们需要统计的是a.b.c,b.c和c。在统计这些字符串时,我们可以使用哈希映射(HashMap)。统计结束之后,我们遍历哈希映射并输出结果。
时间复杂度:O(N),其中N是数组cpdomains的长度
空间复杂度:O(N),用于存储哈希映射
class Solution {
public List<String> subdomainVisits(String[] cpdomains) {
Map<String, Integer> counts = new HashMap();
for(String domain : cpdomains){
//\s匹配任何空白字符,包括空格、制表符、换页符等等。
//匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
String[] cpinfo = domain.split("\\s+");
//将空格后面的域名按照.分开保存在frags数组中
String[] frags = cpinfo[1].split("\\.");
int count = Integer.valueOf(cpinfo[0]);
String cur = "";
for(int i = frags.length - 1; i >= 0; i--){
cur = frags[i] + (i < frags.length - 1 ? "." : "") + cur;
counts.put(cur, counts.getOrDefault(cur, 0) + count);
}
}
List<String> ans = new ArrayList<>();
for(String str : counts.keySet()){
ans.add("" + counts.get(str) + " " + str);
}
Collections.reverse(ans);
return ans;
}
}