Given two strings, the task is to find if a string can be obtained by rotating another string by two places.
Examples:
Input: string1 = “amazon”, string2 = “azonam”
Output: Yes
Explanation: Rotating string1 by 2 places in anti-clockwise gives the string2.
Input: string1 = “amazon”, string2 = “onamaz”
Output: Yes
Explanation: Rotating string1 by 2 places in clockwise gives the string2.
Asked in: Amazon Interview
Approach 1 (by Rotating String Clockwise and Anti-clockwise):
The idea is to Rotate the String1 in both clockwise and ant-clockwise directions. Then if this rotated string is equal to String2.
Illustration:
str1 = “amazon”
str2 = “azonam”
Initialise: clock_rot = “”, anticlock_rot = “”
str1 after 2 places clockwise rotation:
clock_rot = “onamaz”
str1 after 2 places anti-clockwise rotation:
anticlock_rot = “azonam”
Therefore, anticlock_rot and str2 are same.
Hence, str2 can be achieved from str1
Follow the steps below to solve the problem:
- Initialize two empty strings which keep the clockwise and anticlockwise strings respectively.
- After rotating the str1 compare both clockwise and anticlockwise strings with str2.
- If any of them matches the str2 return true, otherwise false.
Below is the implementation of the above approach.
C++
#include<bits/stdc++.h>
using namespace std;
bool isRotated(string str1, string str2)
{
if (str1.length() != str2.length())
return false ;
if (str1.length()<2){
return str1.compare(str2) == 0;
}
string clock_rot = "" ;
string anticlock_rot = "" ;
int len = str2.length();
anticlock_rot = anticlock_rot +
str2.substr(len-2, 2) +
str2.substr(0, len-2) ;
clock_rot = clock_rot +
str2.substr(2) +
str2.substr(0, 2) ;
return (str1.compare(clock_rot) == 0 ||
str1.compare(anticlock_rot) == 0);
}
int main()
{
string str1 = "geeks" ;
string str2 = "eksge" ;
isRotated(str1, str2) ? cout << "Yes"
: cout << "No" ;
return 0;
}
|
Java
class Test
{
static boolean isRotated(String str1, String str2)
{
if (str1.length() != str2.length())
return false ;
if (str1.length() < 2 )
{
return str1.equals(str2);
}
String clock_rot = "" ;
String anticlock_rot = "" ;
int len = str2.length();
anticlock_rot = anticlock_rot +
str2.substring(len- 2 , len) +
str2.substring( 0 , len- 2 ) ;
clock_rot = clock_rot +
str2.substring( 2 ) +
str2.substring( 0 , 2 ) ;
return (str1.equals(clock_rot) ||
str1.equals(anticlock_rot));
}
public static void main(String[] args)
{
String str1 = "geeks" ;
String str2 = "eksge" ;
System.out.println(isRotated(str1, str2) ? "Yes"
: "No" );
}
}
|
Python3
def isRotated(str1, str2):
if ( len (str1) ! = len (str2)):
return False
if ( len (str1) < 2 ):
return str1 = = str2
clock_rot = ""
anticlock_rot = ""
l = len (str2)
anticlock_rot = (anticlock_rot + str2[l - 2 :] +
str2[ 0 : l - 2 ])
clock_rot = clock_rot + str2[ 2 :] + str2[ 0 : 2 ]
return (str1 = = clock_rot or
str1 = = anticlock_rot)
if __name__ = = "__main__" :
str1 = "geeks"
str2 = "eksge"
if isRotated(str1, str2):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
public class Test {
public static bool isRotated( string str1, string str2)
{
if (str1.Length != str2.Length) {
return false ;
}
if (str1.Length < 2) {
return str1.Equals(str2);
}
string clock_rot = "" ;
string anticlock_rot = "" ;
int len = str2.Length;
anticlock_rot
= anticlock_rot
+ str2.Substring(len - 2, len - (len - 2))
+ str2.Substring(0, len - 2);
clock_rot = clock_rot + str2.Substring(2)
+ str2.Substring(0, 2);
return (str1.Equals(clock_rot)
|| str1.Equals(anticlock_rot));
}
public static void Main( string [] args)
{
string str1 = "geeks" ;
string str2 = "eksge" ;
Console.WriteLine(isRotated(str1, str2) ? "Yes"
: "No" );
}
}
|
Javascript
<script>
function isRotated(str1, str2)
{
if (str1.length != str2.length)
return false ;
if (str1.length < 2)
{
return str1.localeCompare(str2);
}
let clock_rot = "" ;
let anticlock_rot = "" ;
let len = str2.length;
anticlock_rot = anticlock_rot +
str2.substring(len - 2, len + 1) +
str2.substring(0, len - 1) ;
clock_rot = clock_rot +
str2.substring(2, str2.length - 2 + 1) +
str2.substring(0, 2 + 1);
return (str1.localeCompare(clock_rot) ||
str1.localeCompare(anticlock_rot));
}
let str1 = "geeks" ;
let str2 = "eksge" ;
document.write(isRotated(str1, str2) ?
"Yes" : "No" );
</script>
|
Time Complexity: O(n), Time is taken to rotate the string and then compare the string.
Auxiliary Space: O(n), Space for storing clockwise and anticlockwise strings.
Approach 2(Without Using auxiliary space):
We could check directly if the string is rotated or not by comparing the two strings.
Illustration:
Steps –
- Check if the string is rotated in clockwise manner.
- Check if the string is rotated in anticlockwise manner.
- Return true if any one of the above is true
We compare for clockwise and anticlockwise by using for loops and the modulo operator-
Note that –
For clockwise – str1[i] == str2[(i + 2) % n]
For anticlockwise – str1[(i + 2) % n] == str2[i]
Here n is length of string
Check using the above two conditions and the problem will be solved!
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
bool isRotated(string str1, string str2)
{
int n = str1.length();
bool clockwise = true , anticlockwise = true ;
for ( int i = 0; i < n; i++)
{
if (str1[i] != str2[(i + 2) % n])
{
clockwise = false ;
break ;
}
}
for ( int i = 0; i < n; i++)
{
if (str1[(i + 2) % n] != str2[i])
{
anticlockwise = false ;
break ;
}
}
return clockwise or anticlockwise;
}
int main()
{
string str1 = "geeks" ;
string str2 = "eksge" ;
isRotated(str1, str2) ? cout << "Yes"
: cout << "No" ;
return 0;
}
|
Java
import java.io.*;
class GFG {
static boolean isRotated(String str1, String str2)
{
int n = str1.length();
int m = str2.length();
if (n != m)
return false ;
boolean clockwise = true ;
boolean anticlockwise = true ;
for ( int i = 0 ; i < n; i++) {
if (str1.charAt(i)!= str2.charAt((i + 2 ) % n)) {
clockwise = false ;
break ;
}
}
for ( int i = 0 ; i < m; i++) {
if (str1.charAt((i + 2 ) % n)!= str2.charAt(i)) {
anticlockwise = false ;
break ;
}
}
return (clockwise || anticlockwise);
}
public static void main (String[] args) {
String str1 = "geeks" ;
String str2 = "eksge" ;
System.out.println(isRotated(str1, str2) ? "Yes"
: "No" );
}
}
|
Python3
def isRotated(str1, str2):
n = len (str1)
clockwise, anticlockwise = True , True
for i in range (n):
if str1[i] ! = str2[(i + 2 ) % n]:
clockwise = False
break
for i in range (n):
if str1[(i + 2 ) % n] ! = str2[i]:
anticlockwise = False
break
return clockwise or anticlockwise
if __name__ = = "__main__" :
str1 = "geeks"
str2 = "eksge"
if isRotated(str1, str2):
print ( "Yes" )
else :
print ( "No" )
|
Javascript
function isRotated(str1, str2) {
let n = str1.length;
let clockwise = true ,
anticlockwise = true ;
for (let i = 0; i < n; i++) {
if (str1[i] != str2[(i + 2) % n]) {
clockwise = false ;
break ;
}
}
for (let i = 0; i < n; i++) {
if (str1[(i + 2) % n] != str2[i]) {
anticlockwise = false ;
break ;
}
}
return clockwise || anticlockwise;
}
let str1 = "geeks" ;
let str2 = "eksge" ;
isRotated(str1, str2) ? console.log( "Yes" ) :
console.log( "No" );
|
C#
using System;
public class GFG{
public static bool IsRotated( string str1, string str2)
{
int n = str1.Length;
bool clockwise = true , anticlockwise = true ;
for ( int i = 0; i < n; i++)
{
if (str1[i] != str2[(i + 2) % n])
{
clockwise = false ;
break ;
}
}
for ( int i = 0; i < n; i++)
{
if (str1[(i + 2) % n] != str2[i])
{
anticlockwise = false ;
break ;
}
}
return clockwise || anticlockwise;
}
public static void Main()
{
string str1 = "geeks" ;
string str2 = "eksge" ;
Console.WriteLine(IsRotated(str1, str2) ? "Yes" : "No" );
}
}
|
Time Complexity – O(n), Iterating over the string 2 times for comparing both the strings.
Space Complexity – O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
23 Mar, 2023
Like Article
Save Article