Minimum rotations required to get the same string
Last Updated :
25 Jul, 2022
Improve
Given a string, we need to find the minimum number of rotations required to get the same string.
Examples:
Input : s = "geeks" Output : 5 Input : s = "aaaa" Output : 1
The idea is based on below post.
A Program to check if strings are rotations of each other or not
- Step 1 : Initialize result = 0 (Here result is count of rotations)
- Step 2 : Take a temporary string equals to original string concatenated with itself.
- Step 3 : Now take the substring of temporary string of size same as original string starting from second character (or index 1).
- Step 4 : Increase the count.
- Step 5 : Check whether the substring becomes equal to original string. If yes, then break the loop. Else go to step 2 and repeat it from the next index.
Implementation:
// C++ program to determine minimum number
// of rotations required to yield same
// string.
#include <iostream>
using namespace std;
// Returns count of rotations to get the
// same string back.
int findRotations(string str)
{
// tmp is the concatenated string.
string tmp = str + str;
int n = str.length();
for (int i = 1; i <= n; i++) {
// substring from i index of original
// string size.
string substring = tmp.substr(i, str.size());
// if substring matches with original string
// then we will come out of the loop.
if (str == substring)
return i;
}
return n;
}
// Driver code
int main()
{
string str = "abc";
cout << findRotations(str) << endl;
return 0;
}
// Java program to determine minimum number
// of rotations required to yield same
// string.
import java.util.*;
class GFG
{
// Returns count of rotations to get the
// same string back.
static int findRotations(String str)
{
// tmp is the concatenated string.
String tmp = str + str;
int n = str.length();
for (int i = 1; i <= n; i++)
{
// substring from i index of original
// string size.
String substring = tmp.substring(
i, i+str.length());
// if substring matches with original string
// then we will come out of the loop.
if (str.equals(substring))
return i;
}
return n;
}
// Driver Method
public static void main(String[] args)
{
String str = "aaaa";
System.out.println(findRotations(str));
}
}
/* This code is contributed by Mr. Somesh Awasthi */
# Python 3 program to determine minimum
# number of rotations required to yield
# same string.
# Returns count of rotations to get the
# same string back.
def findRotations(str):
# tmp is the concatenated string.
tmp = str + str
n = len(str)
for i in range(1, n + 1):
# substring from i index of
# original string size.
substring = tmp[i: i+n]
# if substring matches with
# original string then we will
# come out of the loop.
if (str == substring):
return i
return n
# Driver code
if __name__ == '__main__':
str = "abc"
print(findRotations(str))
# This code is contributed
# by 29AjayKumar.
// C# program to determine minimum number
// of rotations required to yield same
// string.
using System;
class GFG {
// Returns count of rotations to get
// the same string back.
static int findRotations(String str)
{
// tmp is the concatenated string.
String tmp = str + str;
int n = str.Length;
for (int i = 1; i <= n; i++)
{
// substring from i index of
// original string size.
String substring =
tmp.Substring(i, str.Length);
// if substring matches with
// original string then we will
// come out of the loop.
if (str == substring)
return i;
}
return n;
}
// Driver Method
public static void Main()
{
String str = "abc";
Console.Write(findRotations(str));
}
}
// This code is contributed by nitin mittal.
<?php
// PHP program to determine minimum
// number of rotations required to
// yield same string.
// Returns count of rotations
// to get the same string back.
function findRotations($str)
{
// tmp is the concatenated string.
$tmp = ($str + $str);
$n = strlen($str);
for ( $i = 1; $i <= $n; $i++)
{
// substring from i index
// of original string size.
$substring = $tmp.substr($i,
strlen($str));
// if substring matches with
// original string then we will
// come out of the loop.
if ($str == $substring)
return $i;
}
return $n;
}
// Driver code
$str = "abc";
echo findRotations($str), "\n";
// This code is contributed
// by Sachin
?>
<script>
// javascript program to determine minimum number
// of rotations required to yield same
// string.
// Returns count of rotations to get the
// same string back.
function findRotations( str) {
// tmp is the concatenated string.
var tmp = str + str;
var n = str.length;
for (var i = 1; i <= n; i++) {
// substring from i index of original
// string size.
var substring = tmp.substring(i ,str.length);
// if substring matches with original string
// then we will come out of the loop.
if (str===(substring))
return i;
}
return n;
}
// Driver Method
var str = "abc";
document.write(findRotations(str));
// This code contributed by gauravrajput1
</script>
Output
3
Time Complexity: O(n2)
Auxiliary Space : O(n)
We can solve this problem without using any temporary variable as extra space . We will traverse the original string and at each position we partition it and concatenate the right substring and left substring and check whether it is equal to original string
Implementation:
// C++ program to determine minimum number
// of rotations required to yield same
// string.
#include <iostream>
using namespace std;
// Returns count of rotations to get the
// same string back.
int findRotations(string str)
{
int ans = 0; //to store the answer
int n = str.length(); //length of the string
//All the length where we can partition
for(int i=1;i<n-1;i++)
{
//right part + left part = rotated string
// we are checking whether the rotated string is equal to
//original string
if(str.substr(i,n-i) + str.substr(0,i) == str)
{
ans = i;
break;
}
}
if(ans == 0)
return n;
return ans;
}
// Driver code
int main()
{
string str = "abc";
cout << findRotations(str) << endl;
return 0;
}
// Java program to determine minimum number
// of rotations required to yield same
// string.
import java.util.*;
class GFG
{
// Returns count of rotations to get the
// same string back.
static int findRotations(String str)
{
int ans = 0; //to store the answer
int n = str.length(); //length of the string
//All the length where we can partition
for(int i=1;i<str.length()-1;i++)
{
//right part + left part = rotated string
// we are checking whether the rotated string is equal to
//original string
if(str.substring(i, str.length()-i) + str.substring(0, i) == str)
{
ans = i;
break;
}
}
if(ans == 0)
return n;
return ans;
}
// Driver Method
public static void main(String[] args)
{
String str = "abc";
System.out.println(findRotations(str));
}
}
// This code is contributed by Aarti_Rathi
# Python program to determine minimum number
# of rotations required to yield same
# string.
# Returns count of rotations to get the
# same string back.
def findRotations(Str):
ans = 0 # to store the answer
n = len(Str) # length of the String
# All the length where we can partition
for i in range(1 , len(Str) - 1):
# right part + left part = rotated String
# we are checking whether the rotated String is equal to
# original String
if(Str[i: n] + Str[0: i] == Str):
ans = i
break
if(ans == 0):
return n
return ans
# Driver code
Str = "abc"
print(findRotations(Str))
# This code is contributed by shinjanpatra
// C# program to determine minimum number
// of rotations required to yield same
// string.
using System;
class GFG {
// Returns count of rotations to get
// the same string back.
static int findRotations(String str)
{
int ans = 0; //to store the answer
int n = str.Length; //length of the string
//All the length where we can partition
for(int i=1;i<str.Length-1;i++)
{
//right part + left part = rotated string
// we are checking whether the rotated string is equal to
//original string
if(str.Substring(i,n-i) + str.Substring(0,i) == str)
{
ans = i;
break;
}
}
if(ans == 0)
return n;
return ans;
}
// Driver Method
public static void Main()
{
String str = "abc";
Console.Write(findRotations(str));
}
}
// This code is contributed by Aarti_Rathi
<script>
// JavaScript program to determine minimum number
// of rotations required to yield same
// string.
// Returns count of rotations to get the
// same string back.
function findRotations(str)
{
let ans = 0; // to store the answer
let n = str.length; // length of the string
// All the length where we can partition
for(let i = 1; i < str.length - 1; i++)
{
// right part + left part = rotated string
// we are checking whether the rotated string is equal to
// original string
if(str.substr(i, n - i) + str.substr(0, i) == str)
{
ans = i;
break;
}
}
if(ans == 0)
return n;
return ans;
}
// Driver code
let str = "abc";
document.write(findRotations(str),"</br>");
// This code is contributed by shinjanpatra
</script>
Output
3
Time Complexity: O(n2)
Auxiliary Space: O(1)
Alternate Implementation in Python :
// C++ program to determine minimum
// number of rotations required to yield
// same string.
#include <iostream>
using namespace std;
// Driver program
int main()
{
string String = "aaaa";
string check = "";
for(int r = 1; r < String.length() + 1; r++)
{
// checking the input after each rotation
check = String.substr(0, r) + String.substr(r, String.length()-r);
// following if statement checks if input is
// equals to check , if yes it will print r and
// break out of the loop
if(check == String){
cout<<r;
break;
}
}
return 0;
}
// This code is contributed by shinjanpatra
/*package whatever //do not write package name here */
import java.io.*;
class GFG {
public static void main (String[] args) {
String string = "aaaa";
String check = "";
for(int r = 1; r < string.length() + 1; r++)
{
// checking the input after each rotation
check = string.substring(0, r) + string.substring(r, string.length());
// following if statement checks if input is
// equals to check , if yes it will print r and
// break out of the loop
if(check.equals(string)){
System.out.println(r);
break;
}
}
}
}
# Python 3 program to determine minimum
# number of rotations required to yield
# same string.
# input
string = 'aaaa'
check = ''
for r in range(1, len(string)+1):
# checking the input after each rotation
check = string[r:] + string[:r]
# following if statement checks if input is
# equals to check , if yes it will print r and
# break out of the loop
if check == string:
print(r)
break
# This code is contributed
# by nagasowmyanarayanan.
// C# program to determine minimum number
// of rotations required to yield same
// string.
using System;
class GFG {
// Driver Method
public static void Main()
{
String str = "aaaa";
String check = "";
for(int r = 1; r < str.Length + 1; r++)
{
// checking the input after each rotation
check = str.Substring(0, r) + str.Substring(r, str.Length-r);
// following if statement checks if input is
// equals to check , if yes it will print r and
// break out of the loop
if(check == str){
Console.Write(r);
break;
}
}
}
}
// This code is contributed by Aarti_Rathi
<script>
// JavaScript program to determine minimum
// number of rotations required to yield
// same string.
// input
let string = 'aaaa'
let check = ''
for(let r=1;r<string.length+1;r++){
// checking the input after each rotation
check = string.substring(r) + string.substring(0,r)
// following if statement checks if input is
// equals to check , if yes it will print r and
// break out of the loop
if(check == string){
document.write(r)
break
}
}
// This code is contributed
// by shinjanpatra
</script>
Output
1
Time Complexity: O(n2), n as length of string
Auxiliary Space: O(n), n as length of string