Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions strings/booths_algorithm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
class BoothsAlgorithm:
"""
Booth's Algorithm finds the lexicographically minimal rotation of a string.

Time Complexity: O(n) - Linear time where n is the length of input string
Space Complexity: O(n) - Linear space for failure function array

For More Visit - https://en.wikipedia.org/wiki/Booth%27s_multiplication_algorithm
"""

def find_minimal_rotation(self, string: str) -> str:
"""
Find the lexicographically minimal rotation of the input string.

Args:
string (str): Input string to find minimal rotation.

Returns:
str: Lexicographically minimal rotation of the input string.

Raises:
ValueError: If the input is not a string or is empty.

Examples:
>>> ba = BoothsAlgorithm()
>>> ba.find_minimal_rotation("baca")
'abac'
>>> ba.find_minimal_rotation("aaab")
'aaab'
>>> ba.find_minimal_rotation("abcd")
'abcd'
>>> ba.find_minimal_rotation("dcba")
'adcb'
>>> ba.find_minimal_rotation("aabaa")
'aaaab'
"""
if not isinstance(string, str) or not string:
raise ValueError("Input must be a non-empty string")

n = len(string)
s = string + string # Double the string to handle all rotations
f = [-1] * (2 * n) # Initialize failure function array with twice the length
k = 0 # Starting position of minimal rotation

for j in range(1, 2 * n):
sj = s[j]
i = f[j - k - 1]

while i != -1 and sj != s[k + i + 1]:
if sj < s[k + i + 1]:
k = j - i - 1
i = f[i]

if i == -1 and sj != s[k]:
if sj < s[k]:
k = j
f[j - k] = -1
else:
f[j - k] = i + 1

return s[k : k + n]


if __name__ == "__main__":
ba = BoothsAlgorithm()
print(ba.find_minimal_rotation("bca")) # output is 'abc'