使用Python查詢具有相同標籤的子樹中的節點數的程式


假設我們有一棵具有n個節點的根廣義樹,其節點編號從0到n-1。每個節點都有一個帶有小寫英文字母的標籤。標籤作為輸入在labels陣列中給出,其中lables[i]包含第i個節點的標籤。樹由邊列表表示,其中每條邊e都具有[u,v],表示u是父節點,v是子節點。我們必須找到一個大小為n的陣列A,它表示第i個節點的子樹中與i具有相同標籤的節點數。

因此,如果輸入如下所示:

這裡n = 5,label = “ccaca”

則輸出將為[3, 2, 1, 1, 1],因為根節點有三個具有相同標籤的後代,節點1有兩個後代,而所有其他節點本身都具有該標籤。

為了解決這個問題,我們將遵循以下步驟:

  • E := 從給定的邊列表建立圖

  • N := 一個包含每個節點編號及其相應標籤的對映

  • R := 一個大小為n的列表,並填充為0

  • 定義一個函式r()。這將採用ni

  • C := 一個用於儲存鍵頻率的對映

  • 對於E[ni]中的每個e,執行以下操作:

    • 從E[e]中刪除ni

    • 在C中更新r(e)

  • 在C中更新N[ni]

  • R[ni] := C[N[ni]]

  • 返回C

  • 從主方法呼叫r(0)

  • 返回R

讓我們看看下面的實現,以便更好地理解:

示例

 線上演示

from collections import defaultdict, Counter
def solve(n, edges, labels):
   E = defaultdict(set)
   for f,t in edges:
      E[f].add(t)
      E[t].add(f)
   N = {i:e for i,e in enumerate(labels)}
   R = [0]*n
   def r(ni):
      C = Counter()
      for e in E[ni]:
         E[e].remove(ni)
         C.update(r(e))
      C.update((N[ni]))
      R[ni] = C[N[ni]]
      return C
   r(0)
   return R
n = 5
edges = [[0,1],[0,2],[1,3],[0,4]]
labels = "ccaca"
print(solve(n, edges, labels))

輸入

5, [[0,1],[0,2],[1,3],[0,4]], "ccaca"

輸出

[3, 2, 1, 1, 1]

更新於:2021年5月29日

373 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告