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)