Back to all solutions

#1519 - Number of Nodes in the Sub-Tree With the Same Label

Problem Description

You are given a tree (i.e. a connected, undirected graph that has no cycles) consisting of n nodes numbered from 0 to n - 1 and exactly n - 1 edges. The root of the tree is the node 0, and each node of the tree has a label which is a lower-case character given in the string labels (i.e. The node with the number i has the label labels[i]).

The edges array is given on the form edges[i] = [ai, bi], which means there is an edge between nodes ai and bi in the tree.

Return an array of size n where ans[i] is the number of nodes in the subtree of the ith node which have the same label as node i.

A subtree of a tree T is the tree consisting of a node in T and all of its descendant nodes.

Solution

/**
 * @param {number} n
 * @param {number[][]} edges
 * @param {string} labels
 * @return {number[]}
 */
var countSubTrees = function(n, edges, labels) {
  const lookup = Array.from(Array(n), () => []);
  const result = new Array(n).fill(0);

  edges.forEach(([x, y]) => {
    lookup[x].push(y);
    lookup[y].push(x);
  });

  function bfs(index, previous, chars = new Array(26).fill(0)) {
    const key = labels.charCodeAt(index) - 97;
    const count = chars[key];
    chars[key]++;
    lookup[index].forEach(i => {
      if (i !== previous) {
        bfs(i, index, chars);
      }
    });
    result[index] = chars[key] - count;
  }

  bfs(0, -1);

  return result;
};