LEETCODE 1233. Remove Sub-Folders from the Filesystem解题思路分析

题目大意:

删除子文件夹

你是一位系统管理员,手里有一份文件夹列表 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是应该被删除的子文件夹。因此子文件夹应该具有以下特性:

  1. 子文件夹的长度要大于其根文件夹的长度。
  2. 根文件夹是其子文件夹前缀子字符串。

基于以上两点很容易找到答案,不过有一点需要注意,查看前缀子字符串时,要注意以下这种情况:

String folder1 = /a/b;
String folder2 = /a/bbbb

folder1虽然是folder2的前缀子字符串,但他并非是其根文件夹。因此为了防止这种情况的发生,我们可以在根文件夹后面加上一个斜杠。

解题思路大概如下:

  1. 先排序数组。排序后首元素肯定是一个不能删除的元素,将他定义为根文件夹。(没有比他更小的了)
  2. 从数组第二位开始循环,如果当前文件夹的长度小于根文件夹,或者根文件夹不是当前元素的前缀子字符串,说明当前元素不是根文件夹的子目录,将当前文件夹加入返回结果。并且更新根文件夹为当前元素。直到循环结束。

实现代码:

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.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1233-remove-sub-folders-from-the-filesystem解题思路分析/
此条目发表在leetcode分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。