Skip to content

Commit 3d27166

Browse files
committed
Add Palindromic-Tree in data structures
1 parent c685585 commit 3d27166

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import typing
2+
3+
4+
class Node:
5+
def __init__(self):
6+
self.next: typing.Dict[str, Node] = {}
7+
self.frequency = 0
8+
self.length = 0
9+
self.suffix = None
10+
11+
12+
class PalindromicTree:
13+
def __init__(self):
14+
self.null_root = Node()
15+
self.imaginary_root = Node()
16+
17+
self.null_root.length = 0
18+
self.null_root.suffix = self.imaginary_root
19+
self.imaginary_root.length = -1
20+
self.imaginary_root.suffix = self.imaginary_root
21+
22+
self.counter = 0
23+
self.all_palindromes: list[Node] = []
24+
self.previous = self.imaginary_root
25+
26+
def add_letter(self, string, index):
27+
while index - 1 - self.previous.length < 0 or string[index - 1 - self.previous.length] != string[index]:
28+
self.previous = self.previous.suffix
29+
30+
if self.previous.next.get(string[index]) is not None:
31+
node = self.previous.next.get(string[index])
32+
node.frequency += 1
33+
self.previous = node
34+
return
35+
36+
new_node = Node()
37+
38+
self.counter += 1
39+
new_node.frequency = 1
40+
new_node.length = self.previous.length + 2
41+
self.previous.next[string[index]] = new_node
42+
43+
if new_node.length == 1:
44+
new_node.suffix = self.null_root
45+
self.previous = new_node
46+
else:
47+
self.previous = self.previous.suffix
48+
while index - 1 - self.previous.length < 0 or string[index - 1 - self.previous.length] != string[index]:
49+
self.previous = self.previous.suffix
50+
new_node.suffix = self.previous.next[string[index]]
51+
self.previous = new_node
52+
self.all_palindromes.append(new_node)
53+
54+
def how_many_palindromes(self):
55+
all_nr = 0
56+
for node in reversed(self.all_palindromes):
57+
node.suffix.frequency += node.frequency
58+
all_nr += node.frequency
59+
print(f"There are {self.counter} unique palindromes and {all_nr} in total")
60+
61+
62+
tree = PalindromicTree()
63+
64+
s = "abaxxaba"
65+
for i in range(len(s)):
66+
tree.add_letter(s, i)
67+
tree.how_many_palindromes()
68+

0 commit comments

Comments
 (0)