题目大意:
删除子文件夹
你是一位系统管理员,手里有一份文件夹列表 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/d","/a/b/ca"] 输出:["/a/b/c","/a/b/ca","/a/b/d"]
提示:
- 1 <= folder.length <= 4 * 10^4
- 2 <= folder[i].length <= 100
- folder[i] 只包含小写字母和 /
- folder[i] 总是以字符 / 起始
- 每个文件夹名都是唯一的
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1233
解题思路分析:
题目要求删除所有子文件夹,所谓的子文件夹,其实就是如果存在当前字符串的前缀子字符串,当前字符串就是一个子文件夹,比如:
String folder1 = /a/b; String folder2 = /a/b/c
folder1是folder2的前缀子字符串,因此folder2是应该被删除的子文件夹。因此子文件夹应该具有以下特性:
- 子文件夹的长度要大于其根文件夹的长度。
- 根文件夹是其子文件夹前缀子字符串。
基于以上两点很容易找到答案,不过有一点需要注意,查看前缀子字符串时,要注意以下这种情况:
String folder1 = /a/b; String folder2 = /a/bbbb
folder1虽然是folder2的前缀子字符串,但他并非是其根文件夹。因此为了防止这种情况的发生,我们可以在根文件夹后面加上一个斜杠。
解题思路大概如下:
- 先排序数组。排序后首元素肯定是一个不能删除的元素,将他定义为根文件夹。(没有比他更小的了)
- 从数组第二位开始循环,如果当前文件夹的长度小于根文件夹,或者根文件夹不是当前元素的前缀子字符串,说明当前元素不是根文件夹的子目录,将当前文件夹加入返回结果。并且更新根文件夹为当前元素。直到循环结束。
实现代码:
public List<String> removeSubfolders(String[] folder) { Arrays.sort(folder); // 排序数组 List<String> res = new ArrayList<>(); // 定义返回结果 String root = folder[0]+"/"; // 将第一个元素加上斜杠作为根文件夹 res.add(folder[0]); // 将根文件夹放入返回结果 for(int i=1;i<folder.length;i++){ // 从数组第2位开始循环 String f = folder[i]; // 当前文件夹 // 如果当前文件夹长度小于根文件夹, // 或者根文件夹不是其前缀子字符串 // 说明当前文件夹不是子文件夹 if(f.length()<root.length() || !f.startsWith(root)){ root = f+"/"; // 将当前文件夹设为根文件夹 res.add(f); // 将当前文件夹加入返回结果 } } return res; }
本题解法执行时间为42ms。
Runtime: 42 ms, faster than 87.95% of Java online submissions for Remove Sub-Folders from the Filesystem.
Memory Usage: 54.8 MB, less than 100.00% of Java online submissions for Remove Sub-Folders from the Filesystem.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1233-remove-sub-folders-from-the-filesystem解题思路分析/