1233. Remove Sub-Folders from the Filesystem

yPhantom 2019年10月20日 118次浏览

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:

  • 1 <= folder.length <= 4 * 10^4
  • 2 <= folder[i].length <= 100
  • folder[i] contains only lowercase letters and '/'
  • folder[i] always starts with character '/'
  • Each folder name is unique.

Solution

给定一个字符串形式的绝对路径的数组,移除掉数组中是子目录的那些字符串。

首先将数组中的字符串按照字母顺序排序。则非子目录的话只需要满足三个条件之一即可,见代码:

Java版

class Solution {
    public List<String> removeSubfolders(String[] folder) {
        List<String> ant = new ArrayList<>();
        Arrays.sort(folder);
        String parent = "/";
        for (String f: folder) {
            int pSize = parent.length();
            if (f.length() <= pSize || f.charAt(pSize) != '/' || !f.startsWith(parent)) {
                parent = f;
                ant.add(f);
            }
        }
        return ant;
    }
}

Python版

def removeSubfolders(self, folder: List[str]) -> List[str]:
    folder.sort()
    ans, parent = [], '/'
    for f in folder:
        pSize = len(parent)
        if len(f) <= pSize or f[pSize] != '/' or f[: pSize] != parent:
            parent = f
            ans.append(f)   
    return ans