Open In App

C++ Program to Find Lexicographically smallest rotated sequence | Set 2

Improve
Improve
Like Article
Like
Save
Share
Report

Write code to find 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 pseudo-code for 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. 
 

C++




// C++ program to find lexicographically 
// smallest sequence with rotations. 
#include <iostream> 
using namespace std; 
  
// Function to compare lexicographically 
// two sequence with different starting 
// indexes. It returns true if sequence 
// beginning with y is lexicographically 
// greater. 
bool compareSeq(char S[], int x, int y, int n) 
    for (int 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 
int smallestSequence(char S[], int n) 
    int index = 0; 
    for (int 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 
void printSmallestSequence(char S[], int n) 
    int starting_index = smallestSequence(S, n); 
    for (int i = 0; i < n; i++) 
        cout << S[(starting_index + i) % n]; 
  
// driver code 
int main() 
    char S[] = "DCACBCAA"
    int n = 8; 
    printSmallestSequence(S, n); 
    return 0; 


Output: 
 

AADCACBC

Time Complexity : O(n^2) 
Auxiliary Space : O(1)
Please refer complete article on Lexicographically smallest rotated sequence | Set 2 for more details!



Last Updated : 10 Jan, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads