LC 1233. 删除子文件夹

题目描述

这是 LeetCode 上的 1233. 删除子文件夹 ,难度为 中等

你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。

如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下,那么 folder[i] 就是 folder[j] 的 子文件夹 。

文件夹的「路径」是由一个或多个按以下格式串联形成的字符串:'/' 后跟一个或者多个小写英文字母。

例如,"/leetcode""/leetcode/problems" 都是有效的路径,而空字符串和 “/“ 不是。

示例 1:

1
2
3
4
5
输入:folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"]

输出:["/a","/c/d","/c/f"]

解释:"/a/b""/a" 的子文件夹,而 "/c/d/e""/c/d" 的子文件夹。

示例 2:
1
2
3
4
5
输入:folder = ["/a","/a/b/c","/a/b/d"]

输出:["/a"]

解释:文件夹 "/a/b/c""/a/b/d" 都会被删除,因为它们都是 "/a" 的子文件夹。

示例 3:
1
2
3
输入: folder = ["/a/b/c","/a/b/ca","/a/b/d"]

输出: ["/a/b/c","/a/b/ca","/a/b/d"]

提示:

  • $1 <= folder.length <= 4 \times 10^4$
  • $2 <= folder[i].length <= 100$
  • folder[i] 只包含小写字母和 '/'
  • folder[i] 总是以字符 '/' 起始
  • 每个文件夹名都是 唯一 的

字典树

一道字典树裸题,不熟悉字典树的同学可以看前置 🧀 : 【设计数据结构】实现 Trie (前缀树)

定义类 Trie 代表字典树节点,对应物理含义为某个文件夹。该节点含有属性 sisEndstries,分别代表「当前节点所代表文件夹名」、「是否为当前路径的最终文件夹」以及「当前文件夹下的子文件夹集合」。

并且由于每个文件夹名的长度不定,我们使用 Map<String, Trie> 结构来构建 stries

起始先将所有的 $folder[i]$ 加入字典树,随后查询每个 $folder[i]$ 是否为子文件夹,将所有非子文件夹加入答案。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
class Trie {
String s;
boolean isEnd = false;
Map<String, Trie> stries = new HashMap<>();
Trie (String _s) {
s = _s;
}
}
void add(String f) {
String[] ss = f.split("/");
Trie p = root;
for (int i = 1; i < ss.length; i++) {
String s = ss[i];
if (!p.stries.containsKey(s)) p.stries.put(s, new Trie(s));
p = p.stries.get(s);
}
p.isEnd = true;
}
boolean isSubFolder(String f) {
String[] ss = f.split("/");
Trie p = root;
for (int i = 1; i < ss.length - 1; i++) {
String s = ss[i];
if (p.stries.get(s).isEnd) return true;
p = p.stries.get(s);
}
return false;
}
Trie root = new Trie("");
public List<String> removeSubfolders(String[] folder) {
for (String f : folder) add(f);
List<String> ans = new ArrayList<>();
for (String f : folder) {
if (!isSubFolder(f)) ans.add(f);
}
return ans;
}
}

  • 时间复杂度:$O(\sum_{i = 0}^{n - 1} folder[i].length)$
  • 空间复杂度:$O(\sum_{i = 0}^{n - 1} folder[i].length)$

最后

这是我们「刷穿 LeetCode」系列文章的第 No.1223 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。