Given a list of folders folder
, 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.
Example 1:
Input: folder = [/a
,/a/b
,/c/d
,/c/d/e
,/c/f
]
Output: [/a
,/c/d
,/c/f
]
Example 2:
Input: folder = [/a
,/a/b/c
,/a/b/d
]
Output: [/a
]
Example 3:
Input: folder = [/a/b/c
,/a/b/ca
,/a/b/d
]
Output: [/a/b/c
,/a/b/ca
,/a/b/d
]
class Solution:
def removeSubfolders(self, folder: List[str]) -> List[str]:
folder.sort()
result = [folder[0]]
for i in range(1, len(folder)):
if not folder[i].startswith(result[-1] + "/"):
result.append(folder[i])
return result
result
list. This folder is guaranteed to not be a subfolder of any previous folder since it's the first.result
list.result
followed by a /
. This condition ensures that it's a direct descendant.result
list.result
list contains the folders that are not subfolders of any other folder.Consider the input folder = ["/a", "/a/b", "/c/d", "/c/d/e", "/c/f"]
.
folder
becomes ["/a", "/a/b", "/c/d", "/c/d/e", "/c/f"]
.result = ["/a"]
.result
. result = ["/a", "/c/d"]
.result
. result = ["/a", "/c/d", "/c/f"]
.result
is ["/a", "/c/d", "/c/f"]
.startswith
operation).result
list. The sorting operation might also take up O(N) space depending on the sorting algorithm used by the programming language.