2
2
3
3
import doctest
4
4
5
-
6
- def build_suffix_array (s : str ) -> list [int ]:
5
+ def build_suffix_array (input_string : str ) -> list [int ]:
7
6
"""
8
7
Build the suffix array for the given string.
9
8
10
9
Parameters:
11
- s (str): The input string.
10
+ input_string (str): The input string.
12
11
13
12
Returns:
14
13
list[int]: The suffix array (a list of starting indices of
15
14
suffixes in sorted order).
16
15
17
- Examples :
16
+ Example :
18
17
>>> build_suffix_array("banana")
19
18
[5, 3, 1, 0, 4, 2]
20
19
"""
21
- suffixes = [(s [i :], i ) for i in range (len (s ))]
20
+ suffixes = [(input_string [i :], i ) for i in range (len (input_string ))]
22
21
suffixes .sort () # Sort the suffixes lexicographically
23
22
suffix_array = [suffix [1 ] for suffix in suffixes ]
24
23
return suffix_array
25
24
26
-
27
- def build_lcp_array (s : str , suffix_array : list [int ]) -> list [int ]:
25
+ def build_lcp_array (input_string : str , suffix_array : list [int ]) -> list [int ]:
28
26
"""
29
27
Build the LCP array for the given string and suffix array.
30
28
31
29
Parameters:
32
- s (str): The input string.
30
+ input_string (str): The input string.
33
31
suffix_array (list[int]): The suffix array.
34
32
35
33
Returns:
36
34
list[int]: The LCP array.
37
35
38
- Examples :
39
- >>> suffix_array = build_suffix_array("banana")
40
- >>> build_lcp_array("banana", suffix_array )
36
+ Example :
37
+ >>> suffix_arr = build_suffix_array("banana")
38
+ >>> build_lcp_array("banana", suffix_arr )
41
39
[0, 1, 3, 0, 0, 2]
42
40
"""
43
- n = len (s )
41
+ n = len (input_string )
44
42
rank = [0 ] * n
45
43
lcp = [0 ] * n
46
44
@@ -53,32 +51,23 @@ def build_lcp_array(s: str, suffix_array: list[int]) -> list[int]:
53
51
for i in range (n ):
54
52
if rank [i ] > 0 :
55
53
j = suffix_array [rank [i ] - 1 ]
56
- while (i + h < n ) and (j + h < n ) and (s [i + h ] == s [j + h ]):
54
+ while (i + h < n ) and (j + h < n ) and (input_string [i + h ] == input_string [j + h ]):
57
55
h += 1
58
56
lcp [rank [i ]] = h
59
57
if h > 0 :
60
58
h -= 1 # Decrease h for the next suffix
61
59
return lcp
62
60
63
-
64
61
# Example usage
65
62
if __name__ == "__main__" :
66
- s = "banana"
67
- suffix_array = build_suffix_array (s )
68
- lcp_array = build_lcp_array (s , suffix_array )
63
+ test_string = "banana"
64
+ suffix_array = build_suffix_array (test_string )
65
+ lcp_array = build_lcp_array (test_string , suffix_array )
69
66
70
67
print ("Suffix Array:" )
71
68
for i in range (len (suffix_array )):
72
- print (f"{ suffix_array [i ]} : { s [suffix_array [i ]:]} " )
69
+ print (f"{ suffix_array [i ]} : { test_string [suffix_array [i ]:]} " )
73
70
74
71
print ("\n LCP Array:" )
75
72
for i in range (1 , len (lcp_array )):
76
- lcp_info = (
77
- f"LCP between { s [suffix_array [i - 1 ]:]} and "
78
- f"{ s [suffix_array [i ]]} : { lcp_array [i ]} "
79
- )
80
- print (lcp_info )
81
-
82
- # Run doctests
83
- if __name__ == "__main__" :
84
- doctest .testmod ()
73
+ print (f"LCP between { test_string [suffix_array [i - 1 ]:]} and { test_string [suffix_array [i ]]} : { lcp_array [i ]} " )
0 commit comments