[
trie
string
]
Leetcode 1166 Design File System
Problem statement
https://leetcode.com/problems/design-file-system/
Solution
The idea is to use trie, where for each node (folder) we have set of subfolders. Function search
will look for given path
, starting with given node
. It will return (False, None)
if path was not found and (True, node)
if it was found.
createPath(self, path, value)
will check of we have parental folder first, if not: returnFalse
. Then we check if we have this path already, if we have, returnFalse
. Finally, add new node to our trie and return True.get(self, path)
will check if we have path in our trie, if not, return-1
, if we have: return value.
Complexity
Time complexity of createPath
, get
is linear in lenght of input strings. Space complexity is potentially sum all all length of queries.
Code
class TrieNode:
def __init__(self, ch = {}, val = 0):
self.children = ch
self.value = val
class Trie:
def __init__(self):
self.root = TrieNode({}, 0)
def search(self, node, path):
for folder in path:
if folder in node.children:
node = node.children[folder]
else:
return (False, None)
return (True, node)
class FileSystem:
def __init__(self):
self.trie = Trie()
def createPath(self, path, value):
path = path.split("/")[1:]
found, node = self.trie.search(self.trie.root, path[:-1])
if node == None: return False
if path[-1] in node.children: return False
node.children.setdefault(path[-1], TrieNode({}, value))
return True
def get(self, path):
path = path.split("/")[1:]
found, node = self.trie.search(self.trie.root, path)
if node == None: return -1
return node.value
Remark
I have interesting effect here: if we initialize self.root = Trie()
, then for some reason it will save copy of previous call for FileSystem
, need to investigate