Trie Advanced¶
Table of Contents¶
- 676. Implement Magic Dictionary (Medium)
- 212. Word Search II (Hard)
- 3093. Longest Common Suffix Queries (Hard)
- 745. Prefix and Suffix Search (Hard)
- 3045. Count Prefix and Suffix Pairs II (Hard)
- 336. Palindrome Pairs (Hard)
- 1948. Delete Duplicate Folders in System (Hard)
- 425. Word Squares (Hard) 👑
- 527. Word Abbreviation (Hard) 👑
- 588. Design In-Memory File System (Hard) 👑
- 616. Add Bold Tag in String (Medium) 👑
- 758. Bold Words in String (Medium) 👑
- 642. Design Search Autocomplete System (Hard) 👑
- 1065. Index Pairs of a String (Easy) 👑
- 1166. Design File System (Medium) 👑
- 1858. Longest Word With All Prefixes (Medium) 👑
676. Implement Magic Dictionary¶
212. Word Search II¶
from typing import List
from leetpattern.utils import Trie
# Backtracking + Trie
def findWords(board: List[List[str]], words: List[str]) -> List[str]:
trie = Trie()
for word in words:
trie.add_word(word)
m, n = len(board), len(board[0])
result, visit = set(), set()
def dfs(r, c, node, word):
if (
r < 0
or r >= m
or c < 0
or c >= n
or (r, c) in visit
or board[r][c] not in node.children
):
return None
visit.add((r, c))
node = node.children[board[r][c]]
word += board[r][c]
if node.is_word:
result.add(word)
dfs(r - 1, c, node, word)
dfs(r + 1, c, node, word)
dfs(r, c - 1, node, word)
dfs(r, c + 1, node, word)
visit.remove((r, c))
for r in range(m):
for c in range(n):
dfs(r, c, trie.root, "")
return list(result)
def test_find_words():
board = [
["o", "a", "a", "n"],
["e", "t", "a", "e"],
["i", "h", "k", "r"],
["i", "f", "l", "v"],
]
words = ["oath", "pea", "eat", "rain"]
result = findWords(board, words)
assert sorted(result) == ["eat", "oath"]
3093. Longest Common Suffix Queries¶
745. Prefix and Suffix Search¶
3045. Count Prefix and Suffix Pairs II¶
336. Palindrome Pairs¶
1948. Delete Duplicate Folders in System¶
425. Word Squares¶
527. Word Abbreviation¶
588. Design In-Memory File System¶
from collections import defaultdict
class TrieNode:
def __init__(self):
self.children = defaultdict(TrieNode)
self.content = ""
# Trie
class FileSystem:
def __init__(self):
self.root = TrieNode()
def ls(self, path: str) -> list:
cur = self.root
if path != "/":
paths = path.split("/")[1:]
for p in paths:
cur = cur.children[p]
if cur.content:
return [path.split("/")[-1]]
return sorted(cur.children.keys())
def mkdir(self, path: str) -> None:
cur = self.root
paths = path.split("/")[1:]
for p in paths:
cur = cur.children[p]
def addContentToFile(self, filePath: str, content: str) -> None:
cur = self.root
paths = filePath.split("/")[1:]
for p in paths:
cur = cur.children[p]
cur.content += content
def readContentFromFile(self, filePath: str) -> str:
cur = self.root
paths = filePath.split("/")[1:]
for p in paths:
cur = cur.children[p]
return cur.content
obj = FileSystem()
obj.mkdir("/a/b/c")
obj.addContentToFile("/a/b/c/d", "hello")
print(obj.ls("/")) # ["a"]
print(obj.readContentFromFile("/a/b/c/d")) # "hello"
616. Add Bold Tag in String¶
758. Bold Words in String¶
642. Design Search Autocomplete System¶
-
Tags: String, Depth First Search, Design, Trie, Sorting, Heap Priority Queue, Data Stream
1065. Index Pairs of a String¶
1166. Design File System¶
from collections import defaultdict
class TrieNode:
def __init__(self, name):
self.name = name
self.children = defaultdict(TrieNode)
self.value = -1
# Trie
class FileSystem:
def __init__(self):
self.root = TrieNode("")
def createPath(self, path: str, value: int) -> bool:
paths = path.split("/")[1:]
cur = self.root
for idx, path in enumerate(paths):
if path not in cur.children:
if idx == len(paths) - 1:
cur.children[path] = TrieNode(path)
else:
return False
cur = cur.children[path]
if cur.value != -1:
return False
cur.value = value
return True
def get(self, path: str) -> int:
cur = self.root
paths = path.split("/")[1:]
for path in paths:
if path not in cur.children:
return -1
cur = cur.children[path]
return cur.value
# Your FileSystem object will be instantiated and called as such:
path = "/a"
value = 1
obj = FileSystem()
print(obj.createPath(path, value)) # False
print(obj.get(path)) # 1