Subdomain Visit Count
Problem statement
A website domain "discuss.leetcode.com" consists of various subdomains. At the top level, we have "com", at the next level, we have "leetcode.com" and at the lowest level, "discuss.leetcode.com". When we visit a domain like "discuss.leetcode.com", we will also visit the parent domains "leetcode.com" and "com" implicitly.
A count-paired domain is a domain that has one of the two formats "rep d1.d2.d3" or "rep d1.d2" where rep is the number of visits to the domain and d1.d2.d3 is the domain itself.
- For example,
"9001 discuss.leetcode.com"is a count-paired domain that indicates thatdiscuss.leetcode.comwas visited9001times.
Given an array of count-paired domains cpdomains, return an array of the count-paired domains of each subdomain in the input. You may return the answer in any order.
Example 1:
Input: cpdomains = ["9001 discuss.leetcode.com"]Output: ["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]Explanation: We only have one website domain: "discuss.leetcode.com".As discussed above, the subdomain "leetcode.com" and "com" will also be visited. So they will all be visited 9001 times.
Example 2:
Input: cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]Output: ["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]Explanation: We will visit "google.mail.com" 900 times, "yahoo.com" 50 times, "intel.mail.com" once and "wiki.org" 5 times.For the subdomains, we will visit "mail.com" 900 + 1 = 901 times, "com" 900 + 50 + 1 = 951 times, and "org" 5 times.
Constraints:
1 <= cpdomain.length <= 1001 <= cpdomain[i].length <= 100cpdomain[i]follows either the"repi d1i.d2i.d3i"format or the"repi d1i.d2i"format.repiis an integer in the range[1, 104].d1i,d2i, andd3iconsist of lowercase English letters.
My solution
/**
* @param {string[]} cpdomains
* @return {string[]}
*/
var subdomainVisits = function(cpdomains) {
const map = new Map();
const regex = /([0-9]+)\s(\w+\.)?(\w+\.)?([a-zA-Z]{2,})$/;
function insertAndUpdate(str, count) {
if (!map.has(str)) {
map.set(str, 0)
}
map.set(str, map.get(str) + +count)
}
cpdomains.forEach(str => {
const [_, count, sub, domain, top] = str.match(regex)
// console.log(match)
// console.log(count,sub, domain, top)
if (domain === undefined) {
// no sub domain
insertAndUpdate(`${sub}${top}`, count)
insertAndUpdate(`${top}`, count)
} else {
insertAndUpdate(`${sub}${domain}${top}`, count)
insertAndUpdate(`${domain}${top}`, count)
insertAndUpdate(`${top}`, count)
}
})
const result = []
for (const [key, value] of map.entries()) {
result.push(`${value} ${key}`)
}
return result
};