Remove Sub-Folders from the Filesystem

Given a list of folders, remove all sub-folders in those folders and return in any order the folders after removing.

If a folder[i] is located within another folder[j], it is called a sub-folder of it.

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"]
Explanation: Folders "/a/b/" is a subfolder of "/a" and "/c/d/e" is inside of folder "/c/d" in our filesystem.

Example 2:

Input: folder = ["/a","/a/b/c","/a/b/d"]
Output: ["/a"]
Explanation: Folders "/a/b/c" and "/a/b/d/" will be removed because they are subfolders of "/a".

Example 3:

Input: folder = ["/a/b/c","/a/b/ca","/a/b/d"]
Output: ["/a/b/c","/a/b/ca","/a/b/d"]

 

Constraints:


Solution:

class Solution {
    public List<String> removeSubfolders(String[] folder) {
        Arrays.sort(folder, (a, b) -> a.split("/").length - b.split("/").length);
        Set<String> set = new HashSet();
        List<String> result = new ArrayList();
        for (String d : folder) {
            StringBuilder sub = new StringBuilder();
            String[] arr = d.split("/");
            boolean isSub = false;
            for (String s : arr) {
                sub.append("/" + s);
                if (set.contains(sub.toString())) {
                    isSub = true;
                    break;
                }
            }
            if (!isSub) {
                set.add(sub.toString());
                result.add(d);
            }
        }
        // System.out.println(Arrays.toString(folder));
        return result;
    }
}