|
1 | 1 | package main
|
| 2 | + |
| 3 | +func countSubTrees(n int, edges [][]int, labels string) []int { |
| 4 | + var graph = make([][]int, n) |
| 5 | + for row := range graph { |
| 6 | + graph[row] = make([]int, 0) |
| 7 | + } |
| 8 | + |
| 9 | + for _, edge := range edges { |
| 10 | + graph[edge[0]] = append(graph[edge[0]], edge[1]) |
| 11 | + graph[edge[1]] = append(graph[edge[1]], edge[0]) |
| 12 | + } |
| 13 | + |
| 14 | + var visited = make([]bool, n) |
| 15 | + var ans = make([]int, n) |
| 16 | + dfs(0, graph, visited, &ans, labels) |
| 17 | + return ans |
| 18 | +} |
| 19 | + |
| 20 | +func dfs(currentNode int, graph [][]int, visited []bool, ans *[]int, labels string) []int { |
| 21 | + var cnt = make([]int, 26) |
| 22 | + if visited[currentNode] { |
| 23 | + return cnt |
| 24 | + } |
| 25 | + |
| 26 | + visited[currentNode] = true |
| 27 | + var currentChar byte = labels[currentNode] |
| 28 | + |
| 29 | + for i := 0; i < len(graph[currentNode]); i++ { |
| 30 | + sub := dfs(graph[currentNode][i], graph, visited, ans, labels) |
| 31 | + for j := 0; j < 26; j++ { |
| 32 | + cnt[j] += sub[j] |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + cnt[currentChar-'a']++ |
| 37 | + (*ans)[currentNode] = cnt[currentChar-'a'] |
| 38 | + return cnt |
| 39 | +} |
0 commit comments