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

问题: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.xdnf.cn/news/1543983.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Debezium

Debezium 是一个开源的分布式平台&#xff0c;用于捕获数据库变化数据&#xff08;Change Data Capture, CDC&#xff09;。允许用户实时地从数据库中捕捉到数据的变化&#xff08;如插入、更新和删除操作&#xff09;&#xff0c;并将这些变化以结构化的数据流的形式提供给其他…

Java | Leetcode Java题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> levelOrder(Node root) {if (root null) {return new ArrayList<List<Integer>>();}List<List<Integer>> ans new ArrayList<List<Integer>&g…

语音识别控制(软件、硬件)

1. 环境 python版本&#xff1a;3.11.9 2. 完整代码 import sqlite3 import time import wave # 使用wave库可读、写wav类型的音频文件 from funasr import AutoModel import sounddevice as sd import numpy as np from modelscope import pipeline, Tasks from pypinyin …

centos7安装docker DokcerCompose

一, 安装docker 1.更新yum源 yum下载很慢&#xff0c;一直出现正在尝试其它镜像&#xff0c;更改yum地址为阿里云镜像即可 1&#xff09;下载了阿里云提供的CentOS 7的Yum源配置文件&#xff0c;并将其覆盖到系统中的 /etc/yum.repos.d/CentOS-Base.repo 文件。 wget -O /et…

简单计算器(python基础代码撰写)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

宠物鱼油补充剂行业调研:未来几年年复合增长率CAGR为7.8%

宠物鱼油补充剂是一种营养补充剂&#xff0c;富含从鱼类中提取的欧米伽-3 脂肪酸&#xff08;主要是 EPA 和 DHA&#xff09;&#xff0c;专为宠物设计&#xff0c;以改善其健康状况。鱼油补充剂富含奥米加-3 脂肪酸&#xff0c;已被证明对宠物健康有诸多益处&#xff0c;包括改…

分布式环境中,接口超时到底怎么处理?

目录标题 为什么会存在超时?如何应对可能发生的超时?1. 设置合理的超时时间2. 重试机制3. 熔断机制4. 监控和报警5. 日志记录6. 限流和降级7. 异步处理 以上总结 为什么会存在超时? 接口超时是分布式系统中常见的问题&#xff0c;其原因多种多样&#xff0c;涉及网络、服务…

文件系统(软硬链接 动静态库 动态库加载的过程)

文章目录 软硬链接软链接软链接有什么用&#xff1f; 硬链接硬链接有什么用&#xff1f; 动静态库Linux中的动静态库库静态库 && 安装库动态库动态库 VS 静态库用第三方库 动态库加载elf头部信息 软硬链接 先看现象&#xff1a;先创建一个文件&#xff0c;并写入内容 …

ELK-01-elasticsearch-8.15.1安装

文章目录 前言一、下载elasticsearch二、将tar包放到服务器三、解压tar包四、更改配置文件五、添加启动用户六、用elasticserch用户启动6.1 报错6.2 解决问题16.3 解决问题26.4 再次用elasticserch用户启动6.5 windows浏览器打开 七、设置开机自动启动7.1 创建启动脚本7.2 在脚…

在Java中 String能存储多少个字符?

经典面试题 关于String能存储多个字符&#xff0c;这个是面试者在面试中经常被提及的问题&#xff0c;这个问题可以问的很浅&#xff0c;也可以问的很深&#xff0c;具体看面试官看了你的简历后&#xff0c;对你的能力有什么样的看法&#xff0c;今天&#xff0c;我们就这个问…

postman发送与返回,GET与POST使用

1.GET 获取主页 发送&#xff1a; uri: ‘/’ 返回&#xff1a; 2.POST 发送密码 发送&#xff1a; uri: ‘/login.html’ 返回&#xff1a; 3.POST 保存参数 发送&#xff1a; 返回&#xff1a; 4.GET 获取参数 在POST密码之后&#xff0c;服务器发送一个H…

西门子PCS7在CFC中如何连接DB块中的变量

在CFC中所连接的DB块必须是用户数据块(User DB)。在CFC中通过菜单Options Customize Compile/Download… 可以查看和修改用户数据块的范围&#xff0c;默认范围是DB1-DB60&#xff0c;超出该范围的DB块在CFC中无法引用&#xff0c;如果引用了&#xff0c;CFC编译时会提示错误。…

Linux复习--系统管理类(权限优化、备份策略、RAID、资源查看、启动流程、系统优化)

一、权限优化 1、文件的基本权限 以下知识点详细情况点击&#xff1a; Linux--用户身份和文件权限_linux用户文件权限-CSDN博客https://blog.csdn.net/lerp020321/article/details/140232127 1.1、文件身份 身份分类&#xff1a;所有者&#xff08;u&#xff09;、所属组&am…

C++ | Leetcode C++题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* flatten(Node* head) {function<Node*(Node*)> dfs [&](Node* node) {Node* cur node;// 记录链表的最后一个节点Node* last nullptr;while (cur) {Node* next cur->next;// 如果有子节点…

golang学习笔记11-模块化与包管理【重要】

注&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点。 在第六节&#xff08;golang学习笔记6&#xff09;中&#xff0c;我讲了如何自定义包&#xff0c;包其实有两种引用方式&#xff0c;一种是不用模块&#xff0c;还有种是用模块&#xff0c;我…

Leetcode 543. 124. 二叉树的直径 树形dp C++实现

问题&#xff1a;Leetcode 543. 二叉树的直径&#xff08;边权型&#xff09; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之…

创新学生宿舍管理:Spring Boot框架实践

第2章 开发环境与技术 学生宿舍管理系统的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对学生宿舍管理系统用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xff0c;没…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Ga…

《汇编语言》第14章——实验 14访问CMOS RAM

编程&#xff0c;以“年/月/日 时&#xff1a;分&#xff1a;秒”的格式&#xff0c;显示当前的日期、时间 assume cs:code data segment db 2024/09/23 00:00:00,$ data endscode segment start:mov ax,datamov es,axcall get_hms_funccall get_ymd_funcmov dh,12 ;dh中存放…

Beyond 5.5旗舰版和高级版激光软件

Beyond 5.5旗舰版和高级版激光软件具有以下一些特点和功能&#xff1a; 1. 强大的功能特性&#xff1a; • 多媒体支持&#xff1a;它是真正的多媒体控制激光软件&#xff0c;除支持基本的激光图案外&#xff0c;还支持视频、3D 动画和绘图程序等&#xff0c;为用户提供了丰富…