Open In App

PHP Program to Find Lexicographically smallest rotated sequence | Set 2

Last Updated : 22 Jul, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Write code to find the lexicographic minimum in a circular array, e.g. for the array BCABDADAB, the lexicographic minimum is ABBCABDAD
Input Constraint: 1 < n < 1000 

Examples: 

Input:  GEEKSQUIZ
Output: EEKSQUIZG

Input: GFG
Output: FGG

Input : CAPABCQ
Output : ABCQCAP

We have discussed a O(n2Logn) solution in Lexicographically minimum string rotation | Set 1. Here we need to find the starting index of minimum rotation and then print the rotation.

1) Initially assume 0 to be current min 
starting index.
2) Loop through i = 1 to n-1.
a) For each i compare sequence starting
at i with current min starting index
b) If sequence starting at i is lexicographically
smaller, update current min starting
index.

Here is the pseudo-code for the algorithm 

function findIndexForSmallestSequence(S, n):
result = 0
for i = 1:n-1
if (sequence beginning at i <
sequence beginning at result)
result = i
end if
end for
return result

Here is implementation of above algorithm. 

PHP
<?php
// PHP program to find lexicographically
// smallest sequence with rotations.

// Function to compare lexicographically
// two sequence with different starting
// indexes. It returns true if sequence
// beginning with y is lexicographically
// greater.
function compareSeq($S, $x, $y, $n)
{
    for($i = 0; $i < $n; $i++) 
    {
        if ($S[$x] < $S[$y])
            return false;
        else if ($S[$x] > $S[$y])
            return true;
        $x = ($x + 1) % $n;
        $y = ($y + 1) % $n;
    }
    return true;
}

// Function to find starting index
// of lexicographically smallest
// sequence
function smallestSequence($S, $n)
{
    $index = 0;
    for ( $i = 1; $i < $n; $i++)

        // if new sequence is smaller
        if (compareSeq($S, $index, $i, $n))

            // change index of current min
            $index = $i;

    return $index;
}

// Function to print lexicographically
// smallest sequence
function printSmallestSequence($S, $n)
{
    $starting_index = smallestSequence($S, $n);
    for ($i = 0; $i < $n; $i++)
        echo $S[($starting_index + $i) % $n];
}

    // Driver Code
    $S= "DCACBCAA";
    $n = 8;
    printSmallestSequence($S, $n);

// This code is contributed by Ajit.
?>

Output
AADCACBC

Complexity Analysis:

  • Time Complexity : O(n^2)
  • Auxiliary Space : O(1)

Please refer complete article on Lexicographically smallest rotated sequence | Set 2 for more details!


Next Article

Similar Reads