RedEnginePress logo
RedEnginePress
AlgorithmsLanguagesPlaygroundAbout

Booths Algorithm

p
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'