---
# System prepended metadata

title: 1233. Remove Sub-Folders from the Filesystem
tags: [Leetcode, FaceBook, Trie, Medium]

---

# 1233. Remove Sub-Folders from the Filesystem
###### tags: `Leetcode` `Medium` `FaceBook` `Trie`
Link: https://leetcode.com/problems/remove-sub-folders-from-the-filesystem/
## 思路
### 思路一 $O(MNlogN)$ $O(1)$
排序
然后如果答案是空的或者下一个string不是以答案的最后一个字串开始的，就加进答案
时间复杂度分析:
n = folder.length, m = average size of the strings in folder
Because the sort is based on merge sort for Object and time complexity of merge sort is O(n * logn). That means n * logn times comparing happened.
For this question, it just makes the comparing time be O(m). Thus it won't increase the number of "layers" of merge sort to log(n * m).
### 思路二 $O(MN)$ $O(MN)$
Trie
每个node都表示一个folder(路径经过split完之后的结果)，用hashmap存它的下一个string和对应的trienode
如果当前TrieNode是一个路径的结尾，index就会标成这条路径在string array里面的index
建完trie之后，用bfs遍历，然后一个node的index>=0，就把folder[index]加进答案里面，并且下面的所有child都不需要遍历了
## Code
### 思路一
```java=
class Solution {
    public List<String> removeSubfolders(String[] folder) {
        Arrays.sort(folder);
        List<String> ans = new ArrayList<>();
        for(String str:folder){
            if(ans.isEmpty() || !(str.startsWith(ans.get(ans.size()-1)+'/'))){
                ans.add(str);
            }
        }
        return ans;
    }
}
```
### 思路二
```java=
class Solution {
    class TrieNode{
        Map<String, TrieNode> map = new HashMap<>();
        int index = -1;
    }
    
    TrieNode root = new TrieNode();
    List<String> ans = new ArrayList<>();
    
    public List<String> removeSubfolders(String[] folders) {
        for(int j = 0;j < folders.length;j++){
            String[] splited = folders[j].split("/");
            TrieNode curr = root;
            for(int i = 0;i < splited.length;i++){
                if(!curr.map.containsKey(splited[i])){
                    curr.map.put(splited[i], new TrieNode());
                }
                curr = curr.map.get(splited[i]);
            }
            curr.index = j;
        }
        Queue<TrieNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            TrieNode curr = q.poll();
            if(curr.index>=0) ans.add(folders[curr.index]);
            else{
                for(TrieNode child:curr.map.values()){
                    q.add(child);
                }
            }
        }
        return ans;
    }
}
```