题目地址:
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)。
针对给定的III和DDD字符串,构造一个包含1至9的字典序最小字符串。通过遍历输入字符串并根据III和DDD调整构造中的数字顺序来实现。

5887

被折叠的 条评论
为什么被折叠?



