Skip to content

Commit 0f81bce

Browse files
author
Hamid Gasmi
committed
#156 in progress
1 parent 2db99d0 commit 0f81bce

File tree

1 file changed

+30
-40
lines changed

1 file changed

+30
-40
lines changed

5-string-processing-and-pattern-matching-algorithms/1-suffix-trees/non_shared_substring.py

+30-40
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,47 @@
55
from collections import namedtuple
66

77
Edge = namedtuple('Edge', ['parent', 'node', 'start', 'len'])
8+
max_len = 2001
89

910
# BFS traversal on the tree
10-
def non_shared_substring(suffix_tree, len_text):
11+
def dfs_non_shared_substring(suffix_tree, node):
1112

12-
fifo = queue.Queue()
13-
edge = Edge(-1, 0, 0, 0)
14-
fifo.put(edge)
15-
16-
while not fifo.empty():
17-
18-
parent_edge = fifo.get()
19-
node = parent_edge.node
20-
parent = parent_edge.parent
21-
22-
right_part = False
23-
end_left_part = True
24-
for child in suffix_tree.nodes[node]:
25-
26-
child_edge = suffix_tree.nodes[node][child]
27-
28-
right_part = True if child_edge.start > len_text else right_part
29-
end_left_part = end_left_part if child_edge.start == len_text else False
30-
31-
if child_edge.start >= len_text:
32-
continue
33-
34-
current_len = 0 if parent == -1 else suffix_tree.nodes[parent][node].len
35-
edge = Edge(node, child, parent_edge.start, current_len + parent_edge.len)
36-
fifo.put(edge)
37-
38-
if len(suffix_tree.nodes[node]) == 0:
39-
print("Over here 2")
40-
edge = Edge(parent, node, parent_edge.start, parent_edge.len + 1)
41-
break
13+
if len(suffix_tree.nodes[node]) == 0:
14+
return (node, 0, False)
15+
16+
text_len = (len(suffix_tree.text) - 2) // 2
17+
shortest_substr_start = 0
18+
shortest_substr_len = max_len
19+
right_part = False
20+
for child in suffix_tree.nodes[node]:
21+
22+
if suffix_tree.nodes[node][child].start >= text_len:
23+
right_part = True if suffix_tree.nodes[node][child].start > text_len else right_part
24+
continue
25+
26+
(substr_start, substr_len, subright_part) = dfs_non_shared_substring(suffix_tree, child)
27+
right_part = True if subright_part else right_part
28+
29+
if shortest_substr_len > suffix_tree.nodes[node][child].len + substr_len:
30+
shortest_substr_start = suffix_tree.nodes[node][child].start
31+
shortest_substr_len = 1 if substr_len == 0 else suffix_tree.nodes[node][child].len + substr_len
32+
33+
if not right_part:
34+
shortest_substr_len = 0
35+
elif shortest_substr_len == 0:
36+
shortest_substr_len = 1
4237

43-
elif (not right_part) and end_left_part:
44-
print("Over here 1: ", suffix_tree.nodes[node])
45-
edge = Edge(parent, node, parent_edge.start, parent_edge.len)
46-
break
38+
return (shortest_substr_start, shortest_substr_len, right_part)
4739

48-
return suffix_tree.text[edge.start:edge.start + edge.len]
49-
5040
def solve (p, q):
5141
pq_text = p + "#" + q + "$"
5242

5343
suffixTree = suffix_tree.Suffix_Tree(pq_text)
54-
print(suffixTree.nodes)
44+
#print(suffixTree.nodes)
5545

56-
result = non_shared_substring(suffixTree, len(p))
46+
(shortest_substr_start, shortest_substr_len, right_part) = dfs_non_shared_substring(suffixTree, 0)
5747

58-
return result
48+
return suffixTree.text[ shortest_substr_start : shortest_substr_start + shortest_substr_len ]
5949

6050
if __name__ == "__main__":
6151
p = sys.stdin.readline ().strip ()

0 commit comments

Comments
 (0)