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;//返回字数的计数
//     }
// };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值