4
public int[] countSubTrees(int n, int[][] edges, String labels) {6
Map<Integer, List<Integer>> adjList = new HashMap<>();7
for (int i = 0; i < n; i++) {8
adjList.put(i, new ArrayList<>());10
for (int[] edge : edges) {11
adjList.get(edge[0]).add(edge[1]);12
adjList.get(edge[1]).add(edge[0]);14
postOrderDfs(adjList, labels, 0, -1);18
int[] postOrderDfs(Map<Integer, List<Integer>> adjList, String labels, int n, int parent) {19
int[] chars = new int[26];20
chars[labels.charAt(n) - 'a']++;21
for (int next : adjList.get(n)) {22
if (next != parent) mergeArrCounts(chars, postOrderDfs(adjList, labels, next, n));24
res[n] = chars[labels.charAt(n) - 'a'];29
void mergeArrCounts(int[] A, int[] B) {30
for (int i = 0; i < 26; i++) {