Remove Sub-Folders from the Filesystem

medium array sorting string

Problem

Given a list of folder paths, remove every folder that is a sub-folder of another folder in the list. A path x is a sub-folder of y if x starts with y followed by a /. Return the remaining folders in any order.

Inputfolder = ["/a", "/a/b", "/c/d", "/c/d/e", "/c/f"]
Output["/a", "/c/d", "/c/f"]
"/a/b" sits under "/a"; "/c/d/e" sits under "/c/d", so both are dropped.

def remove_subfolders(folder):
    folder.sort()
    ans = []
    for f in folder:
        if not ans or not f.startswith(ans[-1] + "/"):
            ans.append(f)
    return ans
function removeSubfolders(folder) {
  folder.sort();
  const ans = [];
  for (const f of folder) {
    if (ans.length === 0 || !f.startsWith(ans[ans.length - 1] + "/")) {
      ans.push(f);
    }
  }
  return ans;
}
class Solution {
    public List<String> removeSubfolders(String[] folder) {
        Arrays.sort(folder);
        List<String> ans = new ArrayList<>();
        for (String f : folder) {
            if (ans.isEmpty() || !f.startsWith(ans.get(ans.size() - 1) + "/")) {
                ans.add(f);
            }
        }
        return ans;
    }
}
vector<string> removeSubfolders(vector<string>& folder) {
    sort(folder.begin(), folder.end());
    vector<string> ans;
    for (auto& f : folder) {
        if (ans.empty() || f.compare(0, ans.back().size() + 1, ans.back() + "/") != 0) {
            ans.push_back(f);
        }
    }
    return ans;
}
Time: O(n·L·log n) Space: O(n·L)