zoukankan      html  css  js  c++  java
  • 【leetcode】1233. 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:

    • 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.

    解题思路:首先建立字典树,并把folder按元素从短到长排好序,然后遍历folder,并与字典树中已有元素做前缀匹配。如果folder[i]存在于字典树中,表示是其他目录的子目录,删除;如果不存在,则把该目录插入到字典树中。

    代码如下:

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.childDir = {}
            self.isDir = False
    
    class Trie(object):
        dic = {}
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.root = TreeNode(None)
            self.dic = {}
    
        def insert(self,word):
            node = self.root
            for i in word:
                if i not in node.childDir:
                    node.childDir[i] = TreeNode(i)
                node = node.childDir[i]
            node.isDir = True
    
        def isDelete(self,dir):
            node = self.root
            for i in dir:
                if i in node.childDir:
                    node = node.childDir[i]
                    if node.isDir == True:
                        return True
                else:
                    return False
            return False
    
    class Solution(object):
        def removeSubfolders(self, folder):
            """
            :type folder: List[str]
            :rtype: List[str]
            """
            folder.sort(cmp=lambda x1,x2:len(x1) - len(x2))
            trie = Trie()
            res = []
            for f in folder:
                if trie.isDelete(f) == False:
                    res.append(f)
                    trie.insert(f + '/')
            return res
  • 相关阅读:
    Select与Epoll的区别
    C++ 多态详解及常见面试题
    Linux进程状态详解及状态转换
    C++ 设计模式之单例模式
    DS 图解归并排序
    TCP三次握手,四次挥手详解及常见面试题
    Linux 进程间通信(管道、共享内存、消息队列、信号量)
    # maven
    # select sort 选择排序
    # gitlab与git私钥公钥
  • 原文地址:https://www.cnblogs.com/seyjs/p/11713643.html
Copyright © 2011-2022 走看看