Write code to find lexicographic minimum in a circular array, e.g. for the array BCABDADAB, the lexicographic minimum is ABBCABDAD
Input Constraint: 1 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 iHere 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:
AADCACBCTime Complexity : O(n^2)
Auxiliary Space : O(1)
Please refer complete article on Lexicographically smallest rotated sequence | Set 2 for more details!