前往
大廳
主題

LeetCode - 1519. Number of Nodes in the Sub-Tree With the Same Label 解題心得

Not In My Back Yard | 2023-12-06 12:00:01 | 巴幣 0 | 人氣 62

題目連結:


題目意譯:
你被給定一棵樹(即一個連通的、無向的圖,且其無環)由編號為 0 到 n - 1 的 n 個節點以及恰好 n - 1 條邊所組成。樹的根節點為節點 0,而每個節點都會有一個標籤,其為一個小寫字元且以一字串 labels 給定(即編號 i 的節點之標籤為 labels[i])。

邊的陣列 edges,其格式為 edges = [ai, bi],其代表著在樹中節點 ai 到節點 bi 之間有一條邊連接著。

回傳一個大小為 n 的陣列 ans,其中 ans[i] 為以節點 i 作為根節點的子樹之中有多少節點之標籤與節點 i 相同。

一樹 T 之子樹為以 T 中某個節點以及其所有後代節點所組成。

限制:
1 ≦ n ≦ 10 ^ 5
edges.length == n - 1
edges[i].length == 2
0 ≦ ai, bi < n
ai != bi
labels.length == n
labels 只由小寫英文字母組成。



範例測資:
範例 1:
輸入: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], labels = "abaedcd"
輸出: [2,1,1,1,1,1,1]
解釋: 節點 0 有著標籤 'a' 而其子樹存在標籤也為 'a' 節點 2,因此答案為 2。注意到任何節點都是自己的子樹之一部份。
節點 1 有著標籤 'b'。節點 1 的子樹包含著節點 1 、 4 和 5,由於節點 4 和 5 都有著不同的標籤,因此答案為 1(該節點本身)。

範例 2:
輸入: n = 4, edges = [[0,1],[1,2],[0,3]], labels = "bbbb"
輸出: [4,2,1,1]
解釋: 節點 2 的子樹只包含節點 2,因此答案為 1。
節點 3 的子樹只包含節點 3,因此答案為 1。
節點 1 的子樹包含節點 1 和 2,兩者都有著標籤 'b',因此答案為 2。
節點 0 的子樹包含節點 0 、 1 、 2 和 3,全部都有著標籤 'b',因此答案為 4。

範例 3:
輸入: n = 5, edges = [[0,1],[0,2],[1,3],[0,4]], labels = "aabab"
輸出: [3,2,1,1,1]


解題思維:
一樣遞迴求解即可,即深度優先搜尋(Depth First Search,DFS)。

這次要記錄的是某個節點 i 其所有子樹的每一種字母出現次數,如果節點 i 的標籤是 C,則 ans[i] 即為所有子樹中 C 的出現次數 + 1。算完 ans[i] 之後,將 C 的出現次數 + 1 並往遞迴的上一層回傳。

最後整個遞迴跑完之時,即可得到所求陣列 ans。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作