Leetcode 1643 Solution

This article provides solution to leetcode question 1643 (number-of-nodes-in-the-sub-tree-with-the-same-label)

https://leetcode.com/problems/number-of-nodes-in-the-sub-tree-with-the-same-label

Solution

class Solution:
    def countSubTrees(self, n: int, edges: List[List[int]], labels: str) -> List[int]:
        tree = collections.defaultdict(list)
        for src, dst in edges:
            tree[src].append(dst)
            tree[dst].append(src)

        cache = {}

        def dfs(node_id):
            nonlocal tree
            nonlocal labels
            nonlocal cache

            if node_id in cache:
                return cache[node_id]

            # Fill up the cache first.
            cache[node_id] = None

            # Prepare an agg dict.
            agg_dict = collections.defaultdict(int)

            # Walk through the child nodes, and update the agg dict.
            for child_node_id in tree[node_id]:
                child_agg_dict = dfs(child_node_id)

                if child_agg_dict is None:
                    continue

                for k, v in child_agg_dict.items():
                    agg_dict[k] += v

            # Update the current node.
            agg_dict[labels[node_id]] += 1

            # Generate the result, and return it.
            cache[node_id] = agg_dict

            return agg_dict

        return [dfs(i)[label] for i, label in enumerate(labels)]