https://tools.xxooooxx.org/su/aDvpNgZXO
Tag: Tree
class Solution {
public:
void dfs(int pre, int cur, vector<vector<int>> &g, vector<vector<int>> &par, vector<int> &ans, string &s) {
par[s[cur] - 'a'].push_back(cur);
for (auto &x: g[cur]) {
dfs(cur, x, g, par, ans, s);
}
par[s[cur] - 'a'].pop_back();
ans[cur] += 1;
if (par[s[cur] - 'a'].size() > 0) {
int prev = par[s[cur] - 'a'].back();
ans[prev] += ans[cur];
} else if (pre != -1) {
ans[pre] += ans[cur];
}
}
vector<int> findSubtreeSizes(vector<int>& parent, string s) {
int n = parent.size();
vector<vector<int>> g(n);
for (int i = 1; i < n; i++) g[parent[i]].push_back(i);
vector<vector<int>> par(26);
vector<int> ans(n, 0);
dfs(-1, 0, g, par, ans, s);
return ans;
}
};
透過觀察可以發現,題目說要同時進行處理但是事實上也可以從樹的最下層開始處理,這樣的結果會是一樣的。