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
代表字典树节点,对应物理含义为某个文件夹。该节点含有属性 s
、isEnd
和 stries
,分别代表「当前节点所代表文件夹名」、「是否为当前路径的最终文件夹」以及「当前文件夹下的子文件夹集合」。
并且由于每个文件夹名的长度不定,我们使用 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
39class 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 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!