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

• Last Updated : 10 Jan, 2022

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   ` `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!

My Personal Notes arrow_drop_up
Recommended Articles
Page :