欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5465. 子树中标签相同的节点数(图论)

程序员文章站 2023-12-27 08:37:33
...

5465. 子树中标签相同的节点数(图论)

class Solution {
public:
    int vis[100001]{0};
    vector<int>ans;
    vector<int>  dfs(vector<vector<int>> & g,int u,string & labels){
        vector<int> count(26);
            if(vis[u]) return count;
        vis[u]=1;
        for(auto v:g[u]){
            if(!vis[v]){
                vector<int>temp=dfs(g,v,labels);
                for(int i=0;i<26;i++)
                    count[i]+=temp[i];
            } 
        }
        ans[u]=++count[labels[u]-'a'];
        return count;
        
}
    vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {
        vector<vector<int>> g;
        g.resize(n);
         for(auto v: edges){
            g[v[0]].push_back(v[1]);
             g[v[1]].push_back(v[0]);
        }
        ans.resize(n);
        dfs(g,0,labels);    
        return ans;
    }
};


// class Solution {
//     vector<vector<int>> tree;
//     vector<bool> vis;
//     vector<int> ans;
// public:
//     vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {
//         tree.resize(labels.size());
//         vis.resize(labels.size(), false);
//         ans.resize(labels.size());
//         for (auto& e : edges) {
//             tree[e[0]].emplace_back(e[1]);
//             tree[e[1]].emplace_back(e[0]);
//         }
//         vector<int> tmp(26);
//         dfs(0, tmp, labels);
//         return ans;
//     }

//     void dfs(int in, vector<int>& a, string& labels) {
//         if (vis[in]) return; vis[in] = true;

// 	vector<int> tmp(26);
// 	for (auto& out : tree[in]) dfs(out, tmp, labels);
//         ans[in] = ++tmp[labels[in] - 'a'];
//         for (int i = 0; i < 26; ++i) a[i] += tmp[i];
//     }
// };
// class Solution {
//     unordered_map<int,unordered_set<int>> m;
//     vector<int> ans;
// public:
//     vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {
//         for(auto& e : edges)
//         {
//             m[e[0]].insert(e[1]);
//             m[e[1]].insert(e[0]);
//         }
//         ans.resize(n);
//         vector<bool> vis(n,false);
//         dfs(0,labels,vis);
//         return ans;
//     }
//     vector<int> dfs(int root, string& labels,vector<bool> &vis)
//     {
//         vector<int> count(26,0), temp;
//         vis[root] = true;//访问过了
//         for(auto it = m[root].begin(); it != m[root].end(); ++it)
//         {
//             if(vis[*it])
//                 continue;
//             temp = dfs(*it,labels,vis);
//             for(int i = 0; i < 26; ++i)
//                 count[i] += temp[i];//把子树的字符计数更新到本节点
//         }
//         ans[root] = ++count[labels[root]-'a'];//加上自己的
//         return count;//返回字数的计数
//     }
// };

相关标签: leetcode

上一篇:

下一篇: