Skip to content

Commit c7f137e

Browse files
authored
suffix_array_lcp.py
1 parent 70c3869 commit c7f137e

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

divide_and_conquer/suffix_array_lcp.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env python3
22

3+
import doctest
34

45
def build_suffix_array(s: str) -> list[int]:
56
"""
@@ -11,13 +12,16 @@ def build_suffix_array(s: str) -> list[int]:
1112
Returns:
1213
list[int]: The suffix array (a list of starting indices of
1314
suffixes in sorted order).
15+
16+
Examples:
17+
>>> build_suffix_array("banana")
18+
[5, 3, 1, 0, 4, 2]
1419
"""
1520
suffixes = [(s[i:], i) for i in range(len(s))]
1621
suffixes.sort() # Sort the suffixes lexicographically
1722
suffix_array = [suffix[1] for suffix in suffixes]
1823
return suffix_array
1924

20-
2125
def build_lcp_array(s: str, suffix_array: list[int]) -> list[int]:
2226
"""
2327
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]:
2832
2933
Returns:
3034
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]
3140
"""
3241
n = len(s)
3342
rank = [0] * n
@@ -49,7 +58,6 @@ def build_lcp_array(s: str, suffix_array: list[int]) -> list[int]:
4958
h -= 1 # Decrease h for the next suffix
5059
return lcp
5160

52-
5361
# Example usage
5462
if __name__ == "__main__":
5563
s = "banana"
@@ -62,6 +70,10 @@ def build_lcp_array(s: str, suffix_array: list[int]) -> list[int]:
6270

6371
print("\nLCP Array:")
6472
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

Comments
 (0)