diff --git a/strings/booths_algorithm.py b/strings/booths_algorithm.py new file mode 100644 index 000000000..a087d6dc8 --- /dev/null +++ b/strings/booths_algorithm.py @@ -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'