Remove Sub-Folders from the Filesystem - Problem

Given a list of folders, return the folders after removing all sub-folders in those folders. You may return the answer in any order.

If a folder[i] is located within another folder[j], it is called a sub-folder of it. A sub-folder of folder[j] must start with folder[j], followed by a "/". For example, "/a/b" is a sub-folder of "/a", but "/b" is not a sub-folder of "/a/b/c".

The format of a path is one or more concatenated strings of the form: '/' followed by one or more lowercase English letters. For example, "/leetcode" and "/leetcode/problems" are valid paths while an empty string and "/" are not.

Input & Output

Example 1 — Basic Case
$ Input: folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"]
Output: ["/a","/c/d","/c/f"]
💡 Note: "/a/b" is a subfolder of "/a" and "/c/d/e" is a subfolder of "/c/d", so they are removed
Example 2 — No Subfolders
$ Input: folder = ["/a","/b","/c"]
Output: ["/a","/b","/c"]
💡 Note: No folder is a subfolder of another, so all folders are kept
Example 3 — Deep Nesting
$ Input: folder = ["/a","/a/b/c","/a/b/d"]
Output: ["/a"]
💡 Note: Both "/a/b/c" and "/a/b/d" are subfolders of "/a", so only "/a" remains

Constraints

  • 1 ≤ folder.length ≤ 4 × 104
  • 2 ≤ folder[i].length ≤ 100
  • folder[i] contains only lowercase letters and '/'
  • folder[i] always starts with the character '/'
  • Each folder name is unique

Visualization

Tap to expand
Remove Sub-Folders from Filesystem INPUT Folder List: /a /a/b (sub-folder) /c/d /c/d/e (sub-folder) /c/f Tree View: / a b (removed) c d f ALGORITHM STEPS 1 Sort Folders Sort lexicographically so parents come before children ["/a", "/a/b", "/c/d", "/c/d/e", "/c/f"] Sorted order 2 Initialize Result Add first folder to result result = ["/a"] 3 Check Each Folder For each folder, check if it starts with last result + "/" /a/b starts with /a/ [SKIP] /c/d not sub [ADD] /c/d/e starts with /c/d/ [SKIP] 4 Add Non-Sub-Folders /c/f not sub of /c/d [ADD] Return final result FINAL RESULT Remaining Folders (3): /a /c/d /c/f Output: ["/a", "/c/d", "/c/f"] Removed Sub-Folders: /a/b /c/d/e OK - Complete! Key Insight: After sorting lexicographically, all sub-folders immediately follow their parent folders. We only need to check if current folder starts with (last added folder + "/"). Time: O(n log n) for sorting + O(n * m) for checking. Space: O(n) for result. TutorialsPoint - Remove Sub-Folders from the Filesystem | Optimal Solution
Asked in
Amazon 15 Microsoft 12 Google 8
28.5K Views
Medium Frequency
~15 min Avg. Time
892 Likes
Ln 1, Col 1
Smart Actions
💡 Explanation
AI Ready
💡 Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen