Write code to find lexicographic minimum in a circular array, e.g. for the array BCABDADAB, the lexicographic minimum is ABBCABDAD.
Source: Google Written Test
More Examples:
Input: GEEKSQUIZ Output: EEKSQUIZG Input: GFG Output: FGG Input: GEEKSFORGEEKS Output: EEKSFORGEEKSG
Following is a simple solution. Let the given string be 'str'
- Concatenate 'str' with itself and store in a temporary string say 'concat'.
- Create an array of strings to store all rotations of 'str'. Let the array be 'arr'.
- Find all rotations of 'str' by taking substrings of 'concat' at index 0, 1, 2..n-1. Store these rotations in arr[]
- Sort arr[] and return arr[0].
Following is the implementation of above solution.
// A simple C++ program to find lexicographically minimum rotation
// of a given string
#include <iostream>
#include <algorithm>
using namespace std;
// This functionr return lexicographically minimum
// rotation of str
string minLexRotation(string str)
{
// Find length of given string
int n = str.length();
// Create an array of strings to store all rotations
string arr[n];
// Create a concatenation of string with itself
string concat = str + str;
// One by one store all rotations of str in array.
// A rotation is obtained by getting a substring of concat
for (int i = 0; i < n; i++)
arr[i] = concat.substr(i, n);
// Sort all rotations
sort(arr, arr+n);
// Return the first rotation from the sorted array
return arr[0];
}
// Driver program to test above function
int main()
{
cout << minLexRotation("GEEKSFORGEEKS") << endl;
cout << minLexRotation("GEEKSQUIZ") << endl;
cout << minLexRotation("BCABDADAB") << endl;
}
// A simple Java program to find
// lexicographically minimum rotation
// of a given String
import java.util.*;
class GFG
{
// This functionr return lexicographically
// minimum rotation of str
static String minLexRotation(String str)
{
// Find length of given String
int n = str.length();
// Create an array of strings
// to store all rotations
String arr[] = new String[n];
// Create a concatenation of
// String with itself
String concat = str + str;
// One by one store all rotations
// of str in array. A rotation is
// obtained by getting a substring of concat
for (int i = 0; i < n; i++)
{
arr[i] = concat.substring(i, i + n);
}
// Sort all rotations
Arrays.sort(arr);
// Return the first rotation
// from the sorted array
return arr[0];
}
// Driver code
public static void main(String[] args)
{
System.out.println(minLexRotation("GEEKSFORGEEKS"));
System.out.println(minLexRotation("GEEKSQUIZ"));
System.out.println(minLexRotation("BCABDADAB"));
}
}
// This code is contributed by 29AjayKumar
# A simple Python3 program to find lexicographically
# minimum rotation of a given string
# This function return lexicographically minimum
# rotation of str
def minLexRotation(str_) :
# Find length of given string
n = len(str_)
# Create an array of strings to store all rotations
arr = [0] * n
# Create a concatenation of string with itself
concat = str_ + str_
# One by one store all rotations of str in array.
# A rotation is obtained by getting a substring of concat
for i in range(n) :
arr[i] = concat[i : n + i]
# Sort all rotations
arr.sort()
# Return the first rotation from the sorted array
return arr[0]
# Driver Code
print(minLexRotation("GEEKSFORGEEKS"))
print(minLexRotation("GEEKSQUIZ"))
print(minLexRotation("BCABDADAB"))
# This code is contributed by divyamohan123
// A simple C# program to find
// lexicographically minimum rotation
// of a given String
using System;
class GFG
{
// This functionr return lexicographically
// minimum rotation of str
static String minLexRotation(String str)
{
// Find length of given String
int n = str.Length;
// Create an array of strings
// to store all rotations
String []arr = new String[n];
// Create a concatenation of
// String with itself
String concat = str + str;
// One by one store all rotations
// of str in array. A rotation is
// obtained by getting a substring of concat
for (int i = 0; i < n; i++)
{
arr[i] = concat.Substring(i, n);
}
// Sort all rotations
Array.Sort(arr);
// Return the first rotation
// from the sorted array
return arr[0];
}
// Driver code
public static void Main(String[] args)
{
Console.WriteLine(minLexRotation("GEEKSFORGEEKS"));
Console.WriteLine(minLexRotation("GEEKSQUIZ"));
Console.WriteLine(minLexRotation("BCABDADAB"));
}
}
// This code is contributed by Rajput-Ji
<script>
// A simple Javascript program to find
// lexicographically minimum rotation
// of a given String
// This functionr return lexicographically
// minimum rotation of str
function minLexRotation(str)
{
// Find length of given String
let n = str.length;
// Create an array of strings
// to store all rotations
let arr = new Array(n);
// Create a concatenation of
// String with itself
let concat = str + str;
// One by one store all rotations
// of str in array. A rotation is
// obtained by getting a substring of concat
for(let i = 0; i < n; i++)
{
arr[i] = concat.substring(i, i + n);
}
// Sort all rotations
arr.sort();
// Return the first rotation
// from the sorted array
return arr[0];
}
// Driver code
document.write(minLexRotation("GEEKSFORGEEKS") + "</br>");
document.write(minLexRotation("GEEKSQUIZ") + "</br>");
document.write(minLexRotation("BCABDADAB") + "</br>");
// This code is contributed by divyeshrabadiya07
</script>
Output
EEKSFORGEEKSG EEKSQUIZG ABBCABDAD
Lexicographically smallest rotated sequence | Set 2
Time complexity of the above solution is O(n2Logn) under the assumption that we have used a O(nLogn) sorting algorithm.
Auxiliary Space: O(n)
This problem can be solved using more efficient methods like Booth's Algorithm which solves the problem in O(n) time. We will soon be covering these methods as separate posts.