【图论 树 深度优先搜索】2246. 相邻字符不同的最长路径

news2024/11/26 18:37:12

本文涉及知识点

图论 树

图论知识汇总
深度优先搜索汇总

LeetCode 2246. 相邻字符不同的最长路径

给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父节点,由于节点 0 是根节点,所以 parent[0] == -1 。
另给你一个字符串 s ,长度也是 n ,其中 s[i] 表示分配给节点 i 的字符。
请你找出路径上任意一对相邻节点都没有分配到相同字符的 最长路径 ,并返回该路径的长度。
示例 1:
输入:parent = [-1,0,0,1,1,2], s = “abacbe”
输出:3
解释:任意一对相邻节点字符都不同的最长路径是:0 -> 1 -> 3 。该路径的长度是 3 ,所以返回 3 。
可以证明不存在满足上述条件且比 3 更长的路径。
示例 2:
输入:parent = [-1,0,0,0], s = “aabc”
输出:3
解释:任意一对相邻节点字符都不同的最长路径是:2 -> 0 -> 3 。该路径的长度为 3 ,所以返回 3 。

提示:
n == parent.length == s.length
1 <= n <= 105
对所有 i >= 1 ,0 <= parent[i] <= n - 1 均成立
parent[0] == -1
parent 表示一棵有效的树
s 仅由小写英文字母组成

深度优先搜索

令根节点的深度为0,其它节点的深度为父节点深度+1。
枚举各路径的最小深度节点。
DFS(cur)返回 cur 符合以下条件的最长路径长度:
一,cur是深度最小的节点。
二,cur是起点(终点)。
v = {1,1}
如果s[child] != s[cur],1 + DFS(child)加到v。
返回值就是v的最大值。
最小深度为cur的最长路径为:v的最大两个值-1。
** 时间复杂度** : O(nlongn),每个节点处理一次,子节点的结果排序。
** 注意** :s[child]==s[cur]是 DFS要执行,要枚举cur作为最小深度的路径。
用 map或堆代码v,如果元素数量超过2就删除,时间复杂度可以为:O(n)

代码

核心代码

template<class ELE, class ELE2>
void MinSelf(ELE* seft, const ELE2& other)
{
	*seft = min(*seft, (ELE)other);
}

template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{
	*seft = max(*seft, other);
}

class Solution {
public:
	int longestPath(vector<int>& parent, string s) {
		m_s = s;
		const int N = parent.size();
		vector<vector<int>> vNeiBo(N);
		int root = -1;
		for (int i = 0; i < parent.size(); i++) {
			if (-1 == parent[i]) {
				root = i;
			}
			else {
				vNeiBo[parent[i]].emplace_back(i);
			}
		}
		DFS(vNeiBo, root);
		return m_iRet;
	}
	int DFS(const vector<vector<int>>& vNeiBo, int cur) {
		vector<int> v = { 1,1 };
		for (const auto& child : vNeiBo[cur]) {
			if (m_s[cur] == m_s[child]) {
				DFS(vNeiBo,child); 
				continue; }
			v.emplace_back(DFS(vNeiBo, child) + 1);
		}
		sort(v.begin(), v.end(), std::greater<>());
		MaxSelf(&m_iRet, v[0] + v[1] - 1);
		return v[0];
	}
	int m_iRet = 1;
	string m_s;
};

单元测试

template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{
	Assert::AreEqual(t1, t2);
}

template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{
	Assert::AreEqual(v1.size(), v2.size());
	for (int i = 0; i < v1.size(); i++)
	{
		Assert::AreEqual(v1[i], v2[i]);
	}
}

template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{
	sort(vv1.begin(), vv1.end());
	sort(vv2.begin(), vv2.end());
	Assert::AreEqual(vv1.size(), vv2.size());
	for (int i = 0; i < vv1.size(); i++)
	{
		AssertEx(vv1[i], vv2[i]);
	}
}



namespace UnitTest
{
	vector<int> parent;
	string s;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod01)
		{
			parent = { -1, 0, 0, 1, 1, 2 }, s = "abacbe";
			auto res = Solution().longestPath(parent, s);
			AssertEx(3, res);
		}
	
		TEST_METHOD(TestMethod02)
		{
			parent = { -1, 0, 0, 0 }, s = "aabc";
			auto res = Solution().longestPath(parent, s);
			AssertEx(3, res);
		}
		TEST_METHOD(TestMethod03)
		{
			parent = { -1, 0, 1 }, s = "aab";
			auto res = Solution().longestPath(parent, s);
			AssertEx(2, res);
		}
	};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1875141.html

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

相关文章

ElementUI样式优化:el-input修改样式、el-table 修改表头样式、斑马格样式、修改滚动条样式、

效果图&#xff1a; 1、改变日期时间组件的字体颜色背景 .form-class ::v-deep .el-date-editor { border: 1px solid #326AFF; background: #04308D !important; } .form-class ::v-deep .el-date-editor.el-input__wrapper { box-shadow: 0 0 0 0px #326AFF inset; } // 输入…

Python | Leetcode Python题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def removeElements(self, head: ListNode, val: int) -> Li…

Unity保存玩家的数据到文件中(Unity的二进制序列化)

文章目录 文章运行环境什么是二进制序列化读写文件构造函数 自定义二进制序列化 文章运行环境 Unity2022 什么是二进制序列化 Unity中的二进制序列化是一种将游戏对象或数据结构转换为二进制格式的过程&#xff0c;以便于存储或网络传输。这使数据能够以高效的方式保存&…

网络==>总论v4

既然是写ICT方面的文章&#xff0c;就要不断更新版本&#xff0c;不是文学&#xff0c;可以一劳永逸&#xff0c;如果不更新&#xff0c;看十年前或者二十年前的书意义不大&#xff0c;这就是为啥看到很多编程书都更新到第十几版了&#xff0c;因为要与时俱进。 在去一个地方旅…

JS(JavaScript)事件处理(事件绑定)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C语言单链表的算法之删除节点

一&#xff1a;为什么要删除节点 &#xff08;1&#xff09;有时候链表中节点的数据不想要了&#xff0c;就要删除这个节点 二&#xff1a;删除节点的两个步骤 &#xff08;1&#xff09;第一步&#xff1a;找到这个节点 &#xff08;2&#xff09;第二步&#xff1a;删除这个…

麒麟桌面系统CVE-2024-1086漏洞修复

原文链接&#xff1a;麒麟桌面操作系统上CVE-2024-1086漏洞修复 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在麒麟桌面操作系统上修复CVE-2024-1086漏洞的文章。漏洞CVE-2024-1086是一个新的安全漏洞&#xff0c;如果不及时修复&#xff0c;可能会对系统造成安全…

Rust单元测试、集成测试

单元测试、集成测试 在了解了如何在 Rust 中写测试用例后&#xff0c;本章节我们将学习如何实现单元测试、集成测试&#xff0c;其实它们用到的技术还是上一章节中的测试技术&#xff0c;只不过对如何组织测试代码提出了新的要求。 单元测试 单元测试目标是测试某一个代码单…

算法金 | K-均值、层次、DBSCAN聚类方法解析

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 聚类分析概述 聚类分析的定义与意义 聚类分析&#xff08;Clustering Analysis&#xff09;是一种将数据对象分成多个簇&#xff08;…

AI 音乐生成器 MusicGPT,同声传译StreamSpeech!Web短视频平台Sharine

AI 音乐生成器 MusicGPT&#xff0c;同声传译StreamSpeech!Web短视频平台Sharine。 项目简介 MusicGPT 是一款应用程序&#xff0c;允许在任何平台上以高性能方式本地运行最新的音乐生成 AI 模型&#xff0c;而无需安装 Python 或机器学习框架等严重依赖项。 目前它仅支持 Me…

【python】OpenCV—Aruco

文章目录 Detect ArucoGuess Aruco Type Detect Aruco 学习参考来自&#xff1a;OpenCV基础&#xff08;19&#xff09;使用 OpenCV 和 Python 检测 ArUco 标记 更多使用细节可以参考&#xff1a;【python】OpenCV—Color Correction 源码&#xff1a; 链接&#xff1a;http…

二进制方式部署consul单机版

1.consul的下载 mkdir -p /root/consul/data && cd /root/consul wget https://releases.hashicorp.com/consul/1.18.0/consul_1.18.0_linux_amd64.zip unzip consul_1.18.0_linux_amd64.zip mv consul /usr/local/bin/ 2.配置文件 // 配置文件路径&#xff1a; /roo…

Vue 项目运行时,报错Error: Cannot find module ‘node:path‘

Vue 项目运行时&#xff0c;报错Error: Cannot find module ‘node:path’ internal/modules/cjs/loader.js:883throw err;^Error: Cannot find module node:path Require stack: - D:\nodejs\node_modules\npm\node_modules\node_modules\npm\lib\cli.js - D:\nodejs\node_mo…

240628_昇思学习打卡-Day10-SSD目标检测

240628_昇思学习打卡-Day10-SSD目标检测 今天我们来看SSD&#xff08;Single Shot MultiBox Detector&#xff09;算法&#xff0c;SSD是发布于2016年的一种目标检测算法&#xff0c;使用的是one-stage目标检测网络&#xff0c;意思就是说它只需要一步&#xff0c;就能把目标检…

国内多个库被 rsc 钉上 Go 耻辱柱。。。

大家好&#xff0c;我是煎鱼。 这还是比较突然的&#xff0c;下午正努力打工。国内社区群里突然就闹腾起来了。 仔细一看&#xff0c;原来是 Go 核心团队负责人 rsc&#xff0c;又冷不丁搞大招 &#x1f605;。他直接把国内好几个知名库给直接钉上了 Go 源码库的耻辱柱上了。 如…

普元EOS学习笔记-EOS8.3精简版安装

前言 普元EOS是优秀的高低开结合的企业应用软件开发框架。 普元&#xff1a;这是普元公司的名字&#xff0c;普元信息&#xff0c;上市公司哦&#xff0c;这里就不过多安利了。 EOS&#xff1a;普元公司的企业应用开发系统&#xff0c;开发语言是基于Java&#xff0c;技术框…

JavaScript(2)——输入输出和执行顺序

目录 JS的输入输出语法 输出&#xff1a; 输入 JS的代码执行顺序 字面量 JS的输入输出语法 输出&#xff1a; document.write(内容)alert(内容) 页面弹出警告框console.log(内容) 控制台输出语法&#xff0c;程序员调试使用 作用&#xff1a;向body输出内容 注意&…

zabbix-server的搭建

zabbix-server的搭建 部署 zabbix 服务端(192.168.99.180) rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm cd /etc/yum.repos.d sed -i s#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix# zabbix.r…

音频分离人声和伴奏可以实现吗?手机人声分离工具10款无偿分享!

随着科技的飞速发展&#xff0c;音频处理技术已经取得了显著的进步&#xff0c;其中音频分离人声和伴奏已成为现实。这一技术不仅为音乐制作人和音频工程师提供了便利&#xff0c;更为广大音乐爱好者提供了无限的创作可能性。本文将为大家分享10款手机人声分离工具&#xff0c;…

前端面试题(基础篇十二)

一、link标签定义、与import的区别 link 标签定义文档与外部资源的关系。 link 元素是空元素&#xff0c;它仅包含属性。 此元素只能存在于 head 部分&#xff0c;不过它可出现任意数。 link 标签中的 rel 属性定义了当前文档与被链接文档之间的关系。常见的 stylesheet 指的是…