1
1
from collections import deque
2
+ from typing import Dict , List , Union
2
3
3
4
4
5
class Automaton :
5
- def __init__ (self , keywords ):
6
+ def __init__ (self , keywords : List [ str ] ):
6
7
self .adlist = list ()
7
8
self .adlist .append (
8
9
{"value" : "" , "next_states" : [], "fail_state" : 0 , "output" : []}
@@ -12,13 +13,13 @@ def __init__(self, keywords):
12
13
self .add_keyword (keyword )
13
14
self .set_fail_transitions ()
14
15
15
- def find_next_state (self , current_state , char ) :
16
+ def find_next_state (self , current_state : int , char : str ) -> Union [ int , None ] :
16
17
for state in self .adlist [current_state ]["next_states" ]:
17
18
if char == self .adlist [state ]["value" ]:
18
19
return state
19
20
return None
20
21
21
- def add_keyword (self , keyword ) :
22
+ def add_keyword (self , keyword : str ) -> None :
22
23
current_state = 0
23
24
for character in keyword :
24
25
if self .find_next_state (current_state , character ):
@@ -36,7 +37,7 @@ def add_keyword(self, keyword):
36
37
current_state = len (self .adlist ) - 1
37
38
self .adlist [current_state ]["output" ].append (keyword )
38
39
39
- def set_fail_transitions (self ):
40
+ def set_fail_transitions (self ) -> None :
40
41
q = deque ()
41
42
for node in self .adlist [0 ]["next_states" ]:
42
43
q .append (node )
@@ -61,7 +62,7 @@ def set_fail_transitions(self):
61
62
+ self .adlist [self .adlist [child ]["fail_state" ]]["output" ]
62
63
)
63
64
64
- def search_in (self , string ) :
65
+ def search_in (self , string : str ) -> Dict [ str , List [ int ]] :
65
66
"""
66
67
>>> A = Automaton(["what", "hat", "ver", "er"])
67
68
>>> A.search_in("whatever, err ... , wherever")
0 commit comments