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 <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!
Please Login to comment...