 GeeksforGeeks App
Open App Browser
Continue

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

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