Source code for titan_pylib.string.trie
[docs]
1class Trie:
[docs]
2 class Node:
3 def __init__(self):
4 self.c = None
5 self.child = {}
6 self.count = 0
7 self.stop_count = 0
8
9 def __init__(self):
10 self.root = Trie.Node()
11
[docs]
12 def add(self, s: str) -> None:
13 node = self.root
14 for dep, c in enumerate(s):
15 node.count += 1
16 if c not in node.child:
17 node.child[c] = Trie.Node()
18 node = node.child[c]
19 node.c = c
20 node.stop_count += 1
21
[docs]
22 def s_prefix(self, pref) -> int:
23 node = self.root
24 for dep, c in enumerate(pref):
25 if c not in node.child:
26 return dep
27 node = node.child[c]
28 return len(pref)
29
[docs]
30 def count(self, s: str) -> int:
31 node = self.root
32 for dep, c in enumerate(s):
33 if c not in node.child:
34 return 0
35 node = node.child[c]
36 return node.stop_count
37
38 def __contains__(self, s: str) -> bool:
39 return self.count(s) > 0
40
[docs]
41 def print(self, is_sort=False) -> None:
42 def dfs(node: Trie.Node, indent: str) -> None:
43 if len(node.child) == 0:
44 return
45 a = list(node.child.items())
46 if is_sort:
47 a.sort() # 挿入順にするかどうか
48 for c, child in a[:-1]:
49 if child.stop_count > 0:
50 c = "\033[32m" + c + "\033[m"
51 print(f"{indent}├── {c}")
52 dfs(child, f"{indent}| ")
53 c, child = a[-1]
54 if child.stop_count > 0:
55 c = "\033[32m" + c + "\033[m"
56 print(f"{indent}└── {c}")
57 dfs(child, f"{indent} ")
58
59 print("root")
60 dfs(self.root, "")