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