「每日LeetCode」2023年2月8日

本文最后更新于:2023年3月19日 晚上

1233.删除子文件夹

1233.删除子文件夹

Category Difficulty Likes Dislikes
algorithms Medium (51.27%) 118 -

Tags
Companies
你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。
如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下,那么 folder[i] 就是 folder[j] 的 子文件夹
文件夹的「路径」是由一个或多个按以下格式串联形成的字符串:’/‘ 后跟一个或者多个小写英文字母。

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

示例 1:
输入: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:
输入:folder = [“/a”,”/a/b/c”,”/a/b/d”] 输出:[“/a”] 解释:文件夹 “/a/b/c” 和 “/a/b/d” 都会被删除,因为它们都是 “/a” 的子文件夹。
示例 3:
输入: folder = [“/a/b/c”,”/a/b/ca”,”/a/b/d”] 输出: [“/a/b/c”,”/a/b/ca”,”/a/b/d”]

提示:

  • 1 <= folder.length <= 4 * 104
  • 2 <= folder[i].length <= 100
  • folder[i] 只包含小写字母和 ‘/‘
  • folder[i] 总是以字符 ‘/‘ 起始
  • 每个文件夹名都是 唯一

Discussion | Solution

思路

此代码的目的是从一组文件夹中移除子文件夹。它遍历文件夹数组,并按长度排序,以便可以先处理短路径。它将每个文件路径拆分为一组路径组件,并将它们记录到 map 对象中,以便当它遇到更长的路径时,它可以查看是否已经包含在路径中。如果存在,则该路径将被忽略,并且它将继续处理更长的路径。如果不存在,那么它将在结果数组中添加路径,并将其标记为 false,以便在以后的遍历中可以跳过它。最后,它将返回所有结果数组中的路径。

解答

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
/*
* @lc app=leetcode.cn id=1233 lang=javascript
*
* [1233] 删除子文件夹
*/

// @lc code=start
/**
* @param {string[]} folder
* @return {string[]}
*/
var removeSubfolders = function (folder) {
const map = new Map();
const res = [];
folder = folder.sort((a, b) => a.length - b.length);
for (const file of folder) {
const paths = file.split("/").filter((e) => e);
let cur = map;
for (let i = 0; i < paths.length; i++) {
const path = paths[i];
if (cur.has(path)) {
if (cur.get(path) === false) break;
} else {
if (i === paths.length - 1) {
cur.set(path, false);
res.push("/" + paths.join("/"));
} else {
cur.set(path, new Map());
}
}
cur = cur.get(path);
}
}
return res;
};
// @lc code=end