在某文件系统中,存在一些重复的文件夹,重复文件夹的定义为:如果两个或多个文件夹包含相同的非空子文件夹,并且这些子文件夹的结构也相同,则这些文件夹被认为是重复的。输入由多行组成,第一行是文件夹路径的数量 n,接下来的 n 行是各个文件夹的路径。路径以 "/" 开头和结尾,中间每层由 "/" 分隔。输出所有重复文件夹的父路径,按字典升序排列;如果不存在重复的文件夹,则输出“NotFound”。
问题本质为:构建出文件目录树后,询问有多少个子树,忽略根节点以后,他们的子树完全相等。
一个朴素的思路是枚举所有子树,然后进行递归check。
某文件系统中存在一些重复的文件夹,需要找出来并删除。
重复文件夹的定义:如果存在两个(或以上)的文件夹,包含非空且相同的子文件夹,且子文件夹的结构也相同,则认为这些文件夹是重复文件夹。重复文件夹可以属于不同的文件层级。
例如,存在如下文件夹结构:
/a/x/y/
/a/z/
/b/x/y/
/b/z/
则文件夹 /a/ 和 /b/ 为重复文件夹。
如果再新增一个 /b/w/ 文件夹,则 /a/ 和 /b/ 不再是重复文件夹,但 /a/x/ 和 /b/x/ 仍为重复文件夹,/a/z/ 和 /b/z/ 不算作重复文件夹,因为 z 目录下是空的。
给你一组数组 paths ,表示系统中所有存在的文件夹结构,请找出所有的重复文件夹。
如果重复文件夹之间存在父子关系,只返回父文件夹即可(即如果 /a/ 和 /a/x/ 均为重复文件夹,只返回 /a/ 即可),并按字典序返回。
如果不存在重复目录,返回字符串 NotFound。
输入由多行组成,第一行表示 paths 中的元素个数 n,第2~n+1行为 n 个路径名。
每个路径以 "/" 开头和结尾,中间每个层级以 "/" 分隔。
1≤paths.length≤2×104
paths 中每个路径的层数 ≤500
1≤ 每层文件夹名称的长度 ≤10
paths[i]由小写英文字母和 / 组成,
paths 中的路径不存在重复。
返回所有重复文件夹的路径名,每行一个,路径的格式与输入格式一致,各个路径的顺序按字母升序排列。
输入
4
/a/x/y/
/a/z/
/b/x/y/
/b/z/
输出
/a/
/b/
输入
5
/a/x/y/
/a/z/
/b/x/y/
/b/z/
/b/w/
输出
/a/x/
/b/x/
输入
4
/a/x/y/
/a/z/
/b/z/
/b/w/
输出
NotFound
输入
11
/a/
/a/b/
/a/d/
/a/b/a/
/a/b/c/
/a/c/a/
/a/c/c/
/a/d/f/
/a/d/d/
/a/e/f/
/a/e/d/
输出
/a/b/
/a/c/
/a/d/
/a/e/