2246. 相邻字符不同的最长路径(难)

题目

  • 给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父 节点,由于节点 0 是根节点,所以 parent[0] == -1 。
    另给你一个字符串 s ,长度也是 n ,其中 s[i] 表示分配给节点 i 的字符。
    请你找出路径上任意一对相邻节点都没有分配到相同字符的 最长路径 ,并返回该路径的长度。

题解:dfs

  • 根据数组存储孩子节点,先求孩子的最长路径,再求当前节点的最长路径,在递归过程中更新最长路径
var longestPath = function(parent, s) {
    const n = parent.length; // 获取节点数量
    const heir = new Array(n).fill(0).map(() => []); // 创建邻接表以存储每个节点的子节点
    let ans = 0; // 变量用于存储最长路径的长度

    // 构建树的结构
    for (let i = 1; i < n; i++) {
        heir[parent[i]].push(i); // 将每个节点的索引添加到其父节点的子节点列表中
    }

    // 深度优先搜索函数
    const dfs = (i) => {
        let maxLen = 0; // 当前节点的最长路径长度初始化为0

        // 遍历当前节点的所有子节点
        for (let j of heir[i]) {
            let len = dfs(j) + 1; // 递归计算子节点的最长路径并加上当前边的长度

            // 检查当前节点与子节点的字符是否不同
            if (s[i] !== s[j]) {
                // 更新全局最长路径
                ans = Math.max(ans, maxLen + len);
                // 更新当前节点的最长路径
                maxLen = Math.max(len, maxLen);
            }
        }

        // 返回从当前节点出发的最长路径长度
        return maxLen;
    }

    dfs(0); // 从根节点开始DFS

    return ans + 1; // 返回最长路径长度,+1是因为路径长度是边的数量
};
posted @   Frommoon  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示