题目: 删除子文件夹

  • 你是一位系统管理员,手里有一份文件夹列表 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]总是以字符/起始
  • 每个文件夹名都是唯一的

来源:力扣(LeetCode)第5231题(临时)

链接:https://leetcode-cn.com/problems/remove-sub-folders-from-the-filesystem

分析:

  • 只要将数组排序一下,就能很轻松的解决。
  • 排序后所有的子文件夹都会跟在父文件夹后面,只要判断一下前缀是否一样就行了。

代码:

class Solution:
    def removeSubfolders(self, folder: List[str]) -> List[str]:
        folder.sort() # 先排序,让数组中相同的文件夹从少到多放在一起。
        res = []
        t = '//' # 初始化
        for f in folder:
            if not f.startswith(t): # 判断是否包含前一个元素的部分
                res.append(f) # 如果不包含,那么就不是子文件夹,放入答案中
                t = f + '/' # 将当前元素传给t,用于下一轮循环比较。
        return res
class Solution {
    public List<String> removeSubfolders(String[] folder) {
        Arrays.sort(folder);
        List<String> ans = new ArrayList();
        String str = "//";
        for (String f : folder) {
            if (!startsWith(f, str)) {
                ans.add(f);
                str = f + "/";
            }
        }
        return ans;
    }
    
    public boolean startsWith(String str, String sub) {
        for (int i = 0; i < sub.length(); i++) {
            if (str.charAt(i) != sub.charAt(i)) return false;
        }
        return true;
    }
}