1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
private int[] ans;

public int[] countSubTrees(int n, int[][] edges, String labels) {
Map<Integer, List<Integer>> nodeNeighbors = new HashMap<>();
for (int[] edge : edges) {
nodeNeighbors.computeIfAbsent(edge[0], (key) -> new ArrayList<>()).add(edge[1]);
nodeNeighbors.computeIfAbsent(edge[1], (key) -> new ArrayList<>()).add(edge[0]);
}
ans = new int[n];
dfs(0, -1, labels.toCharArray(), nodeNeighbors);
return ans;
}

private int[] dfs(int currNode, int parent, char[] labels, Map<Integer, List<Integer>> nodeNeighbors) {
int[] subtreeLabelCount = new int[26];
for (int neighbor : nodeNeighbors.get(currNode)) {
if (neighbor != parent) {
mergeArray(subtreeLabelCount, dfs(neighbor, currNode, labels, nodeNeighbors));
}
}
int currNodeLabelCount = ++subtreeLabelCount[labels[currNode] - 'a'];
ans[currNode] = currNodeLabelCount;
return subtreeLabelCount;
}

private void mergeArray(int[] arr1, int[] arr2) {
for (int i = 0; i < arr1.length; i++) {
arr1[i] += arr2[i];
}
}
}

递归函数做的事情就是返回给定node代表的tree中各个label的count是多少. 因为label只有小写字母, 因此一个长度为26的数组即可用来表示subtree中的各个label个数的情况. 这道题理解了++, –的作用. 它是直接作用在变量上的, 也就是该变量会产生变化. 比如a++. 假如a的值之前是1, 那么a++后就变为2了.

时间复杂度: O(n)
空间复杂度: O(n)