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++
#include <iostream>
using namespace std;
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 ;
}
int smallestSequence( char S[], int n)
{
int index = 0;
for ( int i = 1; i < n; i++)
if (compareSeq(S, index, i, n))
index = i;
return index;
}
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];
}
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!
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...