Algorithm


Problem Name: 811. Subdomain Visit Count

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 that discuss.leetcode.com was visited 9001 times.

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 <= 100
  • 1 <= cpdomain[i].length <= 100
  • cpdomain[i] follows either the "repi d1i.d2i.d3i" format or the "repi d1i.d2i" format.
  • repi is an integer in the range [1, 104].
  • d1i, d2i, and d3i consist of lowercase English letters.

Code Examples

#1 Code Example with Java Programming

Code - Java Programming


class Solution {
  public List subdomainVisits(String[] cpdomains) {
    Map map = new HashMap<>();
    for (String cpdomain : cpdomains) {
      int spaceIdx = cpdomain.indexOf(' ');
      int count = Integer.parseInt(cpdomain.substring(0, spaceIdx));
      String[] subdomains = cpdomain.substring(spaceIdx + 1).split("\\.");
      StringBuilder sb = new StringBuilder();
      for (int i = subdomains.length - 1; i >= 0; i--) {
        sb.insert(0, subdomains[i]);
        String currDomain = sb.toString();
        map.put(currDomain, map.getOrDefault(currDomain, 0L) + count);
        sb.insert(0, ".");
      }
    }
    List < String> result = new ArrayList<>();
    for (String key : map.keySet()) {
      result.add(map.get(key) + " " + key);
    }
    return result;
  }
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
cpdomains = ["9001 discuss.leetcode.com"]

Output

x
+
cmd
["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]

#2 Code Example with Python Programming

Code - Python Programming


class Solution:
    def subdomainVisits(self, cpdomains):
        counter = collections.Counter()
        for cpdomain in cpdomains:
            count, *domains = cpdomain.replace(" ",".").split(".")
            for i in range(len(domains)):
                counter[".".join(domains[i:])] += int(count)
        return [" ".join((str(v), k)) for k, v in counter.items()]
Copy The Code & Try With Live Editor

Input

x
+
cmd
cpdomains = ["9001 discuss.leetcode.com"]

Output

x
+
cmd
["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]

#3 Code Example with C# Programming

Code - C# Programming


using System.Collections.Generic;

namespace LeetCode
{
    public class _0811_SubdomainVisitCount
    {
        public IList < string> SubdomainVisits(string[] cpdomains)
        {
            var counts = new Dictionary();
            foreach (var domain in cpdomains)
            {
                var cpinfo = domain.Split(' ');

                int count = int.Parse(cpinfo[0]);

                var frags = cpinfo[1].Split('.');
                var currentDomain = "";
                for (int i = frags.Length - 1; i >= 0; i--)
                {
                    currentDomain = frags[i] + (i  <  frags.Length - 1 ? "." : "") + currentDomain;
                    if (counts.TryGetValue(currentDomain, out var existCount))
                        counts[currentDomain] = existCount + count;
                    else
                        counts[currentDomain] = count;
                }
            }

            var answer = new List < string>();
            foreach (var domain in counts.Keys)
                answer.Add($"{counts[domain]} {domain}");
            return answer;
        }
    }
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]

Output

x
+
cmd
["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
Advertisements

Demonstration


Previous
#810 Leetcode Chalkboard XOR Game Solution in C, C++, Java, JavaScript, Python, C# Leetcode
Next
#812 Leetcode Largest Triangle Area Solution in C, C++, Java, JavaScript, Python, C# Leetcode