Welcome to the daily solutions of ourĀ PROBLEM OF THE DAY (POTD). We will discuss the entire problem step-by-step and work towards developing an optimized solution. This will not only help you brush up on your concepts ofĀ StringsĀ but will also help you build up problem-solving skills.

POTD 12 November: Check if string is rotated by two places:
Given two stringsĀ aĀ andĀ b. The task is to find if the string 'b' can be obtained by rotatingĀ (in any direction)Ā string 'a' byĀ exactly 2Ā places.
Examples:Ā
Input: string1 = amazon, string2 = azonam
Output: Yes
Explanation: amazon can be rotated anti-clockwise by two places, which will make it as azonam.Input: string1 = geeksforgeeks, string2 = geeksgeeksfor
Output: No
Explanation: If we rotate geeksforgeeks by two place in any direction, we won't get geeksgeeksfor.
Check if string is rotated by two places by rotating string Clockwise and Anti-clockwise:
The idea is to Rotate the String1 in both clockwise and ant-clockwise directions once. And then check if this rotated string is equal to String2.
Step-by-step approach:
- If the length of both the strings are not equal or they are less than 2, return false.
- Store anti-clockwise rotation of string by concatenating substring of size two from end to the starting of the string.
- Store clockwise rotation of string by concatenating substring of size two from beginning to the end of the string.
- Checking if any of them is equal to string, return true.
Below is the implementation of the above approach:
class Solution {
public:
// Function to check if a string can be obtained by
// rotating another string by exactly 2 places.
bool isRotated(string str1, string str2)
{
if (str1.length() != str2.length())
return false;
if (str1.length() <= 2 || str2.length() <= 2)
return (str1 == str2);
string clock_rot = "";
string anticlock_rot = "";
int len = str2.length();
// storing anti-clockwise rotation of string by
// concatenating substring of size two from end to
// the starting of the string.
anticlock_rot = anticlock_rot
+ str2.substr(len - 2, 2)
+ str2.substr(0, len - 2);
// storing clockwise rotation of string by
// concatenating substring of size two from beginning
// to the end of the string.
clock_rot = clock_rot + str2.substr(2)
+ str2.substr(0, 2);
// checking if any of them is equal to string, we
// return true.
return (str1.compare(clock_rot) == 0
|| str1.compare(anticlock_rot) == 0);
}
};
class Solution
{
//Function to check if a string can be obtained by rotating
//another string by exactly 2 places.
public static boolean isRotated(String str1, String str2)
{
if(str1.length() <= 2 || str2.length() <= 2)
if(str1.equals(str2)) return true;
else return false;
if(str1.length() != str2.length()) return false;
int bt = 0;
char temp,temp1;
int flag = 0;
char c1[] = str1.toCharArray();
char c2[] = str2.toCharArray();
char ck[] = new char[c1.length];
char ak[] = new char[c1.length];
//storing anti-clockwise rotation of string by concatenating
//substring of size two from end to the starting of the string.
for(int a=0; a<c1.length-2; a++){
ck[a] = c1[a+2];
}
ck[c1.length-2] = c1[0];
ck[c1.length-1] = c1[1];
//storing clockwise rotation of string by concatenating substring
//of size two from beginning to the end of the string.
for(int a=2; a<c1.length; a++){
ak[a] = c1[a-2];
}
ak[0] = c1[c1.length-2];
ak[1] = c1[c1.length-1];
//checking if any of them is equal to string, we return true.
for(int a=0; a<c1.length; a++){
if(ck[a]!=c2[a]&&ak[a]!=c2[a]){
flag = 1;
break;
}
}
if(flag == 0){
bt = 1;
}
flag = 0;
if(bt == 1)
return true;
else
return false;
}
}
class Solution:
#Function to check if a string can be obtained by rotating
#another string by exactly 2 places.
def isRotated(self,str1,str2):
n=len(str2)
if(n<3):
return str1==str2
#storing anti-clockwise rotation of string by concatenating
#substring of size two from end to the starting of the string.
anticlock_str=str2[2:]+str2[0:2]
#storing clockwise rotation of string by concatenating substring
#of size two from beginning to the end of the string.
clockwise_str=str2[-2]+str2[-1]+str2[:n-2]
#checking if any of them is equal to string, we return true.
if(str1==anticlock_str or str1==clockwise_str):
return True
return False
Time Complexity: O(N),Ā Time is taken to rotate the string and then compare the string, where N is the length of the strings.
Auxiliary Space: O(N),Ā Space for storing clockwise and anticlockwise strings.
Check if string is rotated by two places without using Auxiliary Space:
The idea is to check directly if the string is rotated or not by comparing the two strings.Ā
Step-by-step approach:
- Compare for clockwise and anticlockwise rotation by using for loops and the modulo operator:
- for clockwise direction,
- Run a loop from i = 0 to i < N
- Ā if str1[i] != str2[(i + 2) % N], then update the variable clockwise as false and break the loop.
- Run a loop from i = 0 to i < N
- For anti clockwise direction
- Run another loop from 0 to i < N
- if str1[i+2] % N != str2[i], then update the variable anticlockwise as false and break the loop.
- Run another loop from 0 to i < N
- for clockwise direction,
- Return clockwise | anticlockwise (if any of them is true, it gives us as true result)
Below is the implementation of the above approach:
class Solution {
public:
// Function to check if a string can be obtained by
// rotating another string by exactly 2 places.
bool isRotated(string str1, string str2)
{
// Your code here
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; // not rotated clockwise
break;
}
}
for (int i = 0; i < n; i++) {
if (str1[(i + 2) % n] != str2[i]) {
anticlockwise
= false; // not rotated anticlockwise
break;
}
}
return clockwise
or anticlockwise; // if any of both is true,
// return true
}
};
public class Solution {
// Function to check if a string can be obtained by
// rotating another string by exactly 2 places.
public boolean isRotated(String str1, String str2)
{
// Your code here
int n = str1.length();
boolean clockwise = true, anticlockwise = true;
// Check if str2 is obtained by rotating str1
// clockwise by 2 places
for (int i = 0; i < n; i++) {
if (str1.charAt(i)
!= str2.charAt((i + 2) % n)) {
clockwise = false; // not rotated clockwise
break;
}
}
// Check if str2 is obtained by rotating str1
// anticlockwise by 2 places
for (int i = 0; i < n; i++) {
if (str1.charAt((i + 2) % n)
!= str2.charAt(i)) {
anticlockwise
= false; // not rotated anticlockwise
break;
}
}
// If either clockwise or anticlockwise rotation is
// true, return true
return clockwise || anticlockwise;
}
}
class Solution:
# Function to check if a string can be obtained by rotating
# another string by exactly 2 places.
def isRotated(self, str1: str, str2: str) -> bool:
# Your code here
n = len(str1)
clockwise, anticlockwise = True, True
# Check if str2 is obtained by rotating str1 clockwise by 2 places
for i in range(n):
if str1[i] != str2[(i + 2) % n]:
clockwise = False # not rotated clockwise
break
# Check if str2 is obtained by rotating str1 anticlockwise by 2 places
for i in range(n):
if str1[(i + 2) % n] != str2[i]:
anticlockwise = False # not rotated anticlockwise
break
# If either clockwise or anticlockwise rotation is true, return true
return clockwise or anticlockwise
Time Complexity: O(N), Iterating over the string 2 times for comparing both the strings, where N is the length of the strings.
Auxiliary Space: O(1)