【Leetcode】1519. Number of Nodes in the Sub-Tree With the Same Label

针对给定的III和DDD字符串,构造一个包含1至9的字典序最小字符串。通过遍历输入字符串并根据III和DDD调整构造中的数字顺序来实现。

题目地址:

https://leetcode.com/problems/number-of-nodes-in-the-sub-tree-with-the-same-label/description/

给定一棵 n n n阶无向树,顶点编号 0 0 0开始。每个顶点有个字符标记,以字符串 s s s给出, s [ u ] s[u] s[u]是点 u u u的标记。要求返回一个长 n n n数组 a a a使得 a [ u ] a[u] a[u] u u u子树里 s [ u ] s[u] s[u]出现的次数。

思路是DFS。代码如下:

class Solution {
public:
  vector<int> countSubTrees(int n, vector<vector<int>> &es, string &ls) {
    vector<int> h(n, -1), e(n - 1 << 1), ne(n - 1 << 1);
    int idx = 0;
    auto add = [&](int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; };
    for (auto &e : es) {
      int a = e[0], b = e[1];
      add(a, b), add(b, a);
    }

    vector<int> res(n);
    auto dfs = [&](this auto &&dfs, int u, int from) -> vector<int> {
      vector<int> cnt(26);
      for (int i = h[u]; ~i; i = ne[i]) {
        int v = e[i];
        if (v != from) {
          auto c = dfs(v, u);
          for (int i = 0; i < 26; i++)
            cnt[i] += c[i];
        }
      }

      res[u] = ++cnt[ls[u] - 'a'];
      return cnt;
    };
    dfs(0, -1);
    return res;
  }
};

时空复杂度 O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值