Delete divide_and_conquer/Suffix Array and LCP implementation.py

This commit is contained in:
Putul Singh 2024-10-19 12:10:54 +05:30 committed by GitHub
parent 6132d40a37
commit 06a7be7ba0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,63 +0,0 @@
class SuffixArray:
def __init__(self, input_string):
"""
Initialize the SuffixArray with the input string and generate the suffix and LCP arrays.
"""
self.input_string = input_string
self.suffix_array = self._create_suffix_array()
self.lcp_array = self._create_lcp_array()
def _create_suffix_array(self):
"""
Create the suffix array for the given input string.
Returns the suffix array, which is a list of indices representing the starting positions of sorted suffixes.
"""
length = len(self.input_string)
sorted_suffixes = sorted(range(length), key=lambda i: self.input_string[i:])
return sorted_suffixes
def _create_lcp_array(self):
"""
Construct the LCP (Longest Common Prefix) array based on the suffix array.
LCP[i] stores the length of the longest common prefix between suffixes at suffix_array[i] and suffix_array[i-1].
"""
length = len(self.input_string)
suffix_array = self.suffix_array
rank = [0] * length
lcp = [0] * length
# Generate the rank array where rank[i] indicates the position of the suffix starting at index i
for index, suffix in enumerate(suffix_array):
rank[suffix] = index
lcp_length = 0
for i in range(length):
if rank[i] > 0:
previous_suffix = suffix_array[rank[i] - 1]
while (i + lcp_length < length) and (previous_suffix + lcp_length < length) and \
self.input_string[i + lcp_length] == self.input_string[previous_suffix + lcp_length]:
lcp_length += 1
lcp[rank[i]] = lcp_length
if lcp_length > 0:
lcp_length -= 1
return lcp
def display_arrays(self):
"""
Print the suffix array and LCP array for the input string.
"""
print("Suffix Array:")
for idx in self.suffix_array:
print(f"{idx}: {self.input_string[idx:]}")
print("\nLCP Array:")
for i in range(1, len(self.lcp_array)):
print(f"LCP between {self.input_string[self.suffix_array[i-1]:]} and {self.input_string[self.suffix_array[i]:]}: {self.lcp_array[i]}")
# Example usage:
if __name__ == "__main__":
input_text = "banana"
suffix_array_instance = SuffixArray(input_text)
# Show the suffix and LCP arrays
suffix_array_instance.display_arrays()