相邻字符不同的最长路径

题目
给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父节点,由于节点 0 是根节点,所以 parent[0] == -1 。

另给你一个字符串 s ,长度也是 n ,其中 s[i] 表示分配给节点 i 的字符。

请你找出路径上任意一对相邻节点都没有分配到相同字符的 最长路径 ,并返回该路径的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-path-with-different-adjacent-characters

在这里插入图片描述

思路

二叉树的最大直径问题
双亲表示法变为邻接表
后序遍历
注意函数每次返回的是半径,计算的是直径

代码

class Solution {
public:
    int ans=0;
    int longestPath(vector<int>& parent, string s) {

        // 二叉树的最大直径问题
        // 双亲表示法变为邻接表
        // 后序遍历
        // 注意函数每次返回的是半径,计算的是直径

        unordered_map<int,vector<int>> mp;

        for(int i=0;i<parent.size();i++)
        mp[parent[i]].push_back(i);                // 邻接表

        postOrderTraverse(mp,0,s);

        return ans;
        
    }

    int postOrderTraverse(unordered_map<int,vector<int>>& mp,int root,string& s){

        if(mp[root].size()==0){
        ans=max(ans,1);
        return 1;
        }

        int max_num=1;
        int max_dep=0;

        priority_queue<int,vector<int>,less<int>> q;

        for(int i=0;i<mp[root].size();i++){

            int t=postOrderTraverse(mp,mp[root][i],s);

            if(s[root]!=s[mp[root][i]]){
                q.push(t);
                max_dep=max(max_dep,t);
            }
        }

        if(q.size()>=1){
            max_num+=q.top();
            q.pop();
        }

        if(q.size()>=1){
            max_num+=q.top();
            q.pop();
        }

        ans=max(ans,max_num);        // 计算直径

        return max_dep+1;          // 返回半径

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值