Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

devtools/2024/9/25 0:34:54/

问题:Leetcode 2246. 相邻字符不同的最长路径 

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

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

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

算法

        考虑用树形 DP 求直径。枚举子树 x 的所有子树 y,维护从 x 出发的最长路径 max_len,那么可以更新答案为从 y 出发的最长路径加上 max_len,再加上 1(边 − y),即合并从 x 出发的两条路径。递归结束时返回 max_len

        对于本题的限制,我们可以在从子树 y 转移过来时,仅考虑从满足 s [ y ] != s [ x ] 的子树 y 转移过来,所以对上述做法加个 if 判断就行了。

        由于本题求的是 点的个数 ,所以答案为最长路径的长度加 1

时间复杂度:O(n)

空间复杂度:O(n)

代码:

class Solution {
public:int longestPath(vector<int>& parent, string s) {int n = parent.size();vector<vector<int>> tree(n); // 两个维度,第一维度为下标,第二维度为孩子的下标for (int i = 1; i < n; i++)tree[parent[i]].emplace_back(i);int ans = 0; // 最长路径长度=最高子树高度+次高子树高度,可以通过遍历取大值实现// return 以x为起点的路径长度auto dfs = [&](auto &&dfs,int x) -> int{int max_len = 0; // 一个节点不形成路径,初始化长度为0for (int y : tree[x]) {int y_len = dfs(dfs,y) + 1;// 每一条以x为起点的路径长度为y的长度+1if (s[x] != s[y]) {ans = max(ans, max_len + y_len); // 更新答案为前面的最大链长+当前最大链长max_len = max(max_len, y_len); // 更新最大链长}}return max_len;};dfs(dfs,0);return ans + 1;}
};


http://www.ppmy.cn/devtools/116735.html

相关文章

C++拷贝构造函数

拷贝 指的是复制数据&#xff0c;复制内存。 在C中&#xff0c;要避免不必要的复制。当把一个对象或变量&#xff0c;一段数据从一个地方复制到另一个地方的时候&#xff0c;我们实际上会拥有两个副本。在程序运行过程中分配的内存大小是有限的&#xff0c;大量的复制势必会造成…

springboot系列--web相关知识探索一

一、web知识探索概述 一、探索大纲 二、SpringMVC原理流程图 二、springmvc自动配置 springboot在底层自动帮我们配置好了mvc所需要的各个组件。当然&#xff0c;我们也可以自己定制化相关组件。 可参考官方文档&#xff1a; 三、静态资源探究 一、静态资源存放位置 静态资…

vue和thinkphp路由伪静态配置

vue路由伪静态配置&#xff1a; location / { try_files $uri $uri/ /index.html; } thinkphp 路由伪静态配置 location ~* (runtime|application)/{ return 403; } location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s$1 last; break; } }

「DAOI R1」Magic

「DAOI R1」Magic 题目背景 -1,-1,2 题目描述 乔木 来到了大魔王的面前&#xff0c;他决定使用魔法击败魔王。 给定一个整数 n n n&#xff0c;表示有 n n n 个魔法阵&#xff0c;在每个魔法阵上都存在着一定的魔力值 a i a_i ai​。 你每次可以选择三个魔法阵 i , j ,…

Maya---机械模型制作

材质效果&#xff08;4&#xff09;_哔哩哔哩_bilibili 三角面 四边面 多边面 *游戏允许出现三角面和四边面 游戏中一般是低模&#xff08;几千个面&#xff09; 动漫及影视是高模 机械由单独零件组合而成&#xff0c;需独立制作 低面模型到高面模型 卡线是为了将模型保…

Qt-拖放

概述 拖放提供了一种简单的可视化机制&#xff0c;用户可以使用它在应用程序之间和应用程序内部传输信息。拖放功能类似于剪贴板的剪切和粘贴机制。 本文档描述了基本的拖放机制&#xff0c;并概述了在自定义控件中启用它的方法。Qt的许多控件也支持拖放操作&#xff0c;如it…

element-ui多个消息提示只显示最后一个

在使用 Element UI 的 Message 消息提示时&#xff0c;默认情况下&#xff0c;如果你连续调用多个 Message 方法&#xff0c;它们会依次显示&#xff0c;直到用户关闭或它们自动消失。但是&#xff0c;如果你希望只保留最后一个消息提示&#xff0c;即每当新消息出现时&#xf…

算法【Java】—— 位运算

位运算总结 位运算的运算符&#xff1a;按位与&#xff08;&&#xff09;&#xff0c;按位或&#xff08;|&#xff09;&#xff0c;按位异或&#xff08;^&#xff09;&#xff0c;按位取反&#xff08;~&#xff09;&#xff0c;还有移位操作符 <<&#xff0c;>…