2
2
3
3
class De_Bruijn_Graph :
4
4
def __init__ (self , k , text ):
5
- pass
5
+
6
+ assert (k > 1 )
7
+ assert (len (text ) >= k )
6
8
7
- def _build_adjacency_list (self ):
8
- pass
9
+ self ._build_gragh (k , text )
10
+
11
+ def _build_gragh (self , k , text ):
12
+
13
+ self .nodes = []
14
+ self .adjacency_list = []
15
+ node_kmer_no_dict = dict ()
16
+ for i in range (len (text ) - k + 1 ):
17
+
18
+ prefix_node_no = self .get_node_no (text [0 :k - 1 ], node_kmer_no_dict ) if i == 0 else suffix_node_no
19
+ suffix_node_no = self .get_node_no (text [i + 1 :i + k ], node_kmer_no_dict )
20
+
21
+ self .adjacency_list [prefix_node_no ].append (suffix_node_no )
22
+
23
+ def get_node_no (self , kmer , node_kmer_no_dict ):
24
+
25
+ if kmer in node_kmer_no_dict :
26
+ node_no = node_kmer_no_dict [kmer ]
27
+
28
+ else :
29
+ node_no = len (self .nodes )
30
+ self .nodes .append (kmer )
31
+ self .adjacency_list .append ([])
32
+ node_kmer_no_dict [kmer ] = node_no
33
+
34
+ return node_no
9
35
10
36
def str_adjacency_list (self ):
11
- pass
37
+
38
+ result_list = []
39
+ for node in range (len (self .nodes )):
40
+ if len (self .adjacency_list [node ]) == 0 :
41
+ continue
42
+
43
+ node_adjacents = [ self .nodes [node ] ]
44
+ node_adjacents .append (' -> ' )
45
+ for a in range (len (self .adjacency_list [node ])):
46
+ adjacent_node_id = self .adjacency_list [node ][a ]
47
+ node_adjacents .append (self .nodes [adjacent_node_id ])
48
+ if a < len (self .adjacency_list [node ]) - 1 :
49
+ node_adjacents .append (',' )
50
+ result_list .append ('' .join (node_adjacents ))
51
+
52
+ return '\n ' .join (result_list )
12
53
13
54
if __name__ == "__main__" :
14
55
k = int (sys .stdin .readline ().strip ())
15
56
text = sys .stdin .readline ().strip ()
16
57
17
58
de_bruijn_graph = De_Bruijn_Graph (k , text )
18
-
59
+
19
60
print (de_bruijn_graph .str_adjacency_list ())
0 commit comments