在视频应用 APP
中,有多个专区,每个专区可以包含多个栏目,称为栏目的上架。专区是顶层栏目,父对象为 root
,用 -1
表示。一个专区内只能包含栏目,不能包含其他专区。栏目和专区的名称互不重复,且同一栏目可以被多个不同的专区或父栏目上架。由于运营人员的误操作,可能会出现栏目之间的死循环,即在从根节点到叶子节点的遍历过程中,出现重复的栏目名称,导致系统执行代码时陷入死循环,最终引发系统宕机。题目要求设计一个程序检测系统中的所有栏目死循环,并将其路径打印出来。如果没有检测到死循环,则输出 NotFound
。
这道题的核心是通过图的深度优先搜索(DFS)来检测栏目的死循环。首先,将每个上架关系解析为图的邻接表形式,其中父节点指向子节点。在遍历过程中,使用DFS从根节点 -1
开始递归地探索每个路径,同时维护一个路径栈和一个访问集合,以检测路径中是否存在重复的栏目节点。如果发现重复节点,说明出现了死循环,记录当前路径并停止继续递归。最后,对所有死循环路径进行排序和去重,如果没有检测到任何死循环,输出 NotFound
。
视频 APP 里有多个专区,将栏目放到专区里成放到它栏目里,我们称为栏目的上架。专区是一种顶层栏目,里面只能放入栏目不能放入专区。专区的父对象就是 root ,我们用 −1 表示。栏目或专区里上架的栏目不能重名,所有专区不重名,也不存在栏目和专区重名,但同一个栏目可以上架到多个不同的专区或父栏目中。有时运营人员的误操作,会出现栏目的死循环。如果从栏目树的根节点往一个叶子节点遍历过程中,出现重复的栏目名称,则定义为一个栏目死循环。已知专区名称和栏目名称不会重复,且一条从根往叶子遍历的路径上最多只有一个死循坏。
如上图,有 2 处出现死循环,这种栏目上架死循环的数据会导致执行代码的死循环,引发系统宕机。因此为了避免出现这种情况,需要检测系统中的栏目死循坏。现在需要设计一个栏目树死循环检测程序,将检测到的所有死循环打印出来。
如上图,有2处出现死循环,这种栏目上架死循环的数据会导致执行代码的死循环,引发系统宕机。因此为了避免出现这种情况,需要检测系统中的栏目死循环。现在需要设计一个栏目树死循环检测程序,将检测到的所有死循环打印出来。
输入是一行字符串,用分号;分隔多个栏目或专区上架关系。分号分隔后每一部分为逗号分隔的字符串,逗号左边是当前栏目或专区,逗号右边为要上架的父栏目或专区。图上的输入对应为
C1,−1;C2,−1;A,C1;B,C1;M,C2;N,C2;L,C2;A1,A;A2,A;A,N;A,A2;C,A2
输入分号的数量 <1000 ,逗号数量 >=1 ,所有输入都是合法输入,没有空白字符。输入字符串长度 <=100000.
从根节点 −1 开始的包含死循环的路径,例如上图打印输出
−1−>C1−>A−>A2−>A
−1>C2−>N−>A−>A2−>A
多条找到的路径,打印顺序按每条路径的 String 字典升序输出
每个专区下可能有多个死循环,每条找到的路径打印一行记录,如果所有专区都没有找到死循环,则最终打印
NotFound
输入
C1,-1;C2,-1;A,C1;B,C1;M,C2;N,C2;L,C2;A1,A;A2,A;A,N;A,A2;C,A2
输出
-1->C1->A->A2->A
-1->C2->N->A->A2->A
说明
如题目描述,这里有 2 处死循环。如果一个本身有死循环的子树挂载到多个不同的节点上,则被挂载节点就会各自出现一个死循环。
输入
C1,-1;A,C1;A,A
输出
-1->C1->A->A
说明
这里栏目A里放入了自己,也是一种死循环
输入
C1,-1;A,C1;B,C1
输出
NotFound
说明
上图没有栏目死循环,故输出NotFound
所有的栏目的祖先都是根节点,也就是向父节点遍历最终都可以遍历到−1。
在从根节点往叶子节点遍历过程中,出现死循环换后的栏目没有子栏目了。