LeetCode探索(141):811-子域名访问计数

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

题目

网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" ,二级域名为 "leetcode.com" ,最低一级为 "discuss.leetcode.com" 。当访问域名 "discuss.leetcode.com" 时,同时也会隐式访问其父域名 "leetcode.com" 以及 "com"

计数配对域名 是遵循 "rep d1.d2.d3""rep d1.d2" 格式的一个域名表示,其中 rep 表示访问域名的次数,d1.d2.d3 为域名本身。例如,"9001 discuss.leetcode.com" 就是一个 计数配对域名 ,表示 discuss.leetcode.com 被访问了 9001 次。

给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

示例 1:

输入:cpdomains = ["9001 discuss.leetcode.com"]
输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]
解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。
按照前文描述,子域名 "leetcode.com""com" 都会被访问,所以它们都被访问了 9001 次。

示例 2:

输入:cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]
输出:["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
解释:按照前文描述,会访问 "google.mail.com" 900 次,"yahoo.com" 50 次,"intel.mail.com" 1 次,"wiki.org" 5 次。
而对于父域名,会访问 "mail.com" 900 + 1 = 901 次,"com" 900 + 50 + 1 = 951 次,和 "org" 5 次。

提示:

  • 1 <= cpdomain.length <= 100
  • 1 <= cpdomain[i].length <= 100
  • cpdomain[i] 会遵循 "repi d1i.d2i.d3i""repi d1i.d2i" 格式
  • repi 是范围 [1, 104] 内的一个整数
  • d1id2id3i 由小写英文字母组成

思考

本题难度中等。

首先是读懂题意。 给出一个 计数配对域名 组成的数组 cpdomains ,我们需要返回解析得到的每个子域名对应的 计数配对域名 ,并以数组形式返回。

我们可以借助哈希表进行计数。遍历 cpdomains 数组,对于每个计数配对域名,按空格进行拆分得到数量和域名。接着,使用哈希表记录域名及其次数。遍历域名,如果碰到 "." ,则取"."后面的字符串,记录该字符串及其次数。最后,遍历完成后,遍历哈希表并返回所需的数组即可。

解答

方法一:哈希表

/**
 * @param {string[]} cpdomains
 * @return {string[]}
 */
var subdomainVisits = function(cpdomains) {
  let map = new Map()
  for(let cpdomain of cpdomains) {
    let [count, domain] = cpdomain.split(' ')
    count = +count
    map.set(domain, (map.get(domain) || 0) + count)
    for (let i = 0; i < domain.length; i++) {
      if (domain[i] === '.') {
        let subDomain = domain.slice(i + 1)
        map.set(subDomain, (map.get(subDomain) || 0) + count)
      }
    }
  }
  const ans = []
  for (const [subdomain, count] of map.entries()) {
    ans.push(count + " " + subdomain)
  }
  return ans
}

复杂度分析:

  • 时间复杂度:O(L),其中 L 是数组 cpdomains 中的所有字符串长度之和。遍历数组中所有的计数配对域名进行计数需要 O(L) 的时间,遍历哈希表也需要 O(L) 的时间。
  • 空间复杂度:O(L)。哈希表需要 O(L) 的空间。

参考