leetcode
leetcode 1151 ~ 1200
删除子文件夹

删除子文件夹

难度:

标签:

题目描述

代码结果

运行时间: 52 ms, 内存: 29.8 MB


/*
 * 使用Java Stream实现:
 * 1. 对文件夹路径进行排序。
 * 2. 过滤掉所有是其他路径的子文件夹的路径。
 * 3. 收集结果并返回。
 */
import java.util.*;
import java.util.stream.*;

public class Solution {
    public List<String> removeSubfolders(String[] folder) {
        // 排序并过滤子文件夹
        return Arrays.stream(folder)
                     .sorted()
                     .filter(f -> result.isEmpty() || !f.startsWith(result.get(result.size() - 1) + "/"))
                     .collect(Collectors.toList());
    }
}

解释

方法:

首先对文件夹列表进行排序,以确保任何文件夹都会在其可能的子文件夹之前出现。然后,初始化一个空结果列表以及一个表示当前父文件夹的变量。遍历排序后的文件夹路径,对于每个路径,检查它是否以当前父文件夹为前缀。如果不是,更新当前的父文件夹并将其加入结果列表。这样可以确保只有最顶级的文件夹被加入到结果中,因为一旦一个文件夹被认定为父文件夹,所有的子文件夹(由于字符串排序的特性,子文件夹会紧随其后)都会被忽略。

时间复杂度:

O(n log n + nm)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么在检查是否为子文件夹时,需要将父文件夹路径后添加'/'进行比较?
在检查当前文件夹是否为某个已确定的父文件夹的子文件夹时,添加'/'是为了确保精确匹配文件夹的边界。例如,如果父文件夹是'/a/b',而当前文件夹是'/a/bc',仅仅比较前缀'/a/b'会错误地认为'/a/bc'是'/a/b'的子文件夹。添加'/'变成'/a/b/'后,'/a/bc'就不会被认为是子文件夹,因为它不匹配前缀'/a/b/'。这样可以避免错误地将两个实际上是平级关系的文件夹处理为父子关系。
🦆
在算法中,初始化`ind`为2的具体原因是什么?是否与文件夹路径的格式有关?
初始化`ind`为2的具体原因可能是误解或错误。在上下文中,`ind`应该是表示父文件夹路径长度加1的索引,用于确保子文件夹比较时的正确性。理论上,`ind`应该初始化为一个与路径无关的值,或在逻辑中根据首个文件夹路径在循环开始时设置。这里将`ind`初始化为2没有明确的逻辑依据,可能是代码书写上的疏忽。
🦆
排序后的文件夹列表中,如何确保每个文件夹都在其可能的子文件夹之前?排序是否考虑了所有的边界情况,如文件夹名称相似但不同的情况?
通过对文件夹路径进行字典序排序,可以确保每个文件夹都会在其可能的任何子文件夹之前出现。字典序排序意味着字符串是按照字符顺序逐个比较的,这自然地将较短的或者在字典序中较早的路径排在前面。这种排序方式已经考虑了包括文件夹名称相似但不同的情况,例如'/a'会排在'/a/b'之前。这确保了在处理时能够按照父文件夹到子文件夹的顺序进行正确处理。
🦆
如果输入的文件夹列表中包含重复的路径,这个算法处理上会有什么影响?
如果输入的文件夹列表中包含重复的路径,这个算法依然可以正确地处理。由于每个文件夹只有在不是之前文件夹的子文件夹时才被添加到结果列表中,重复的路径会在第一次出现时被添加到结果列表,之后的重复项由于与当前父文件夹完全相同,不会再次被添加。因此,结果列表中不会包含重复的文件夹路径。

相关问题