Задача: Количество узлов

Задача: Количество узлов


Условие: дано дерево (т.е. связный неориентированный граф, не имеющий циклов), состоящее из n узлов с числом от 0 до n - 1 и ровно n - 1 ребер. Корнем дерева является узел 0, и каждый узел дерева имеет метку, которая представляет собой символ нижнего регистра, указанный в строковых метках (т.е. узел с номером i имеет метку labels[i]).


Массив ребер задан на ребрах фермы[i] = [ai, bi], что означает наличие ребра между узлами ai и bi в дереве.


Возвращает массив размера n, где и[i] - количество узлов в поддереве узла земли, которые имеют ту же метку, что и узел i.


Поддерево дерева - это дерево, состоящее из узла в T и всех его дочерних узлов.


Пример:


Ввод: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], labels = "abaedcd"

Вывод: [2,1,1,1,1,1,1]

Объяснение:


Ввод: n = 4, edges = [[0,1],[1,2],[0,3]], labels = "bbbb"

Вывод: [4,2,1,1]


Решение на языке Go:

Сложность

Временная сложность: O(n)O(n)O(n)

Пространственная сложность: O(n)O(n)O(n)

Код:

func countSubTrees(n int, edges [][]int, labels string) []int {
    ans := make([]int, n)
    adjList := make([][]int, n)

    for _, edge :=  range edges {
        i, j := edge[0], edge[1]
        adjList[i] = append(adjList[i], j)
        adjList[j] = append(adjList[j], i)
    }

    visited := make([]bool, n)
    _ = dfs(0, adjList, ans, labels, visited)
    return ans
}

func dfs(node int, adjList [][]int, ans []int, labels string, visited []bool) []int {
    count := make([]int , 26)
    if visited[node] {
        return count
    }

    visited[node] = true
    for _, child := range adjList[node] {
        cCount := dfs(child, adjList, ans, labels, visited)
        for i := range cCount {
            count[i] += cCount[i]
        }
    }
    
    label := int(labels[node] - 'a')
    count[label]++
    ans[node] = count[label]
    return count
}


Report Page