Check if a string can be obtained by rotating another string d places

Given two strings str1 and str2 and an integer d, the task is to check whether str2 can be obtained by rotating str1 by d places (either to the left or to the right).

Examples:

Input: str1 = “abcdefg”, str2 = “cdefgab”, d = 2
Output: Yes
Rotate str1 2 places to the left.

Input: str1 = “abcdefg”, str2 = “cdfdawb”, d = 6
Output: No

Approach: An approach to solve the same problem has been discussed here. In this article, reversal algorithm is used to rotate the string to the left and to the right in O(n). If any one of the rotations of str1 is equal to str2 then print Yes else print No.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to reverse an array from left
// index to right index (both inclusive)
void ReverseArray(string& arr, int left, int right)
{
    char temp;
    while (left < right) {
        temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
        left++;
        right--;
    }
}
  
// Function that returns true if str1 can be
// made equal to str2 by rotating either
// d places to the left or to the right
bool RotateAndCheck(string& str1, string& str2, int d)
{
  
    if (str1.length() != str2.length())
        return false;
  
    // Left Rotation string will contain
    // the string rotated Anti-Clockwise
    // Right Rotation string will contain
    // the string rotated Clockwise
    string left_rot_str1, right_rot_str1;
    bool left_flag = true, right_flag = true;
    int str1_size = str1.size();
  
    // Copying the str1 string to left rotation string
    // and right rotation string
    for (int i = 0; i < str1_size; i++) {
        left_rot_str1.push_back(str1[i]);
        right_rot_str1.push_back(str1[i]);
    }
  
    // Rotating the string d positions to the left
    ReverseArray(left_rot_str1, 0, d - 1);
    ReverseArray(left_rot_str1, d, str1_size - 1);
    ReverseArray(left_rot_str1, 0, str1_size - 1);
  
    // Rotating the string d positions to the right
    ReverseArray(right_rot_str1, 0, str1_size - d - 1);
    ReverseArray(right_rot_str1, str1_size - d, str1_size - 1);
    ReverseArray(right_rot_str1, 0, str1_size - 1);
  
    // Compairing the rotated strings
    for (int i = 0; i < str1_size; i++) {
  
        // If cannot be made equal with left rotation
        if (left_rot_str1[i] != str2[i]) {
            left_flag = false;
        }
  
        // If cannot be made equal with right rotation
        if (right_rot_str1[i] != str2[i]) {
            right_flag = false;
        }
    }
  
    // If both or any one of the rotations
    // of str1 were equal to str2
    if (left_flag || right_flag)
        return true;
    return false;
}
  
// Driver code
int main()
{
  
    string str1 = "abcdefg";
    string str2 = "cdefgab";
  
    // d is the rotating factor
    int d = 2;
  
    // In case length of str1 < d
    d = d % str1.size();
  
    if (RotateAndCheck(str1, str2, d))
        cout << "Yes";
    else
        cout << "No";
  
    return 0;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
  
# Function to reverse an array from left 
# index to right index (both inclusive) 
def ReverseArray(arr, left, right) :
      
    while (left < right) :
        temp = arr[left]; 
        arr[left] = arr[right]; 
        arr[right] = temp; 
        left += 1
        right -= 1
  
# Function that returns true if str1 can be 
# made equal to str2 by rotating either 
# d places to the left or to the right 
def RotateAndCheck(str1, str2, d) :
  
    if (len(str1) != len(str2)) :
        return False
  
    # Left Rotation string will contain 
    # the string rotated Anti-Clockwise 
    # Right Rotation string will contain 
    # the string rotated Clockwise 
    left_rot_str1 = []; right_rot_str1 = []; 
    left_flag = True; right_flag = True
    str1_size = len(str1); 
  
    # Copying the str1 string to left rotation string 
    # and right rotation string 
    for i in range(str1_size) :
        left_rot_str1.append(str1[i]); 
        right_rot_str1.append(str1[i]); 
  
    # Rotating the string d positions to the left 
    ReverseArray(left_rot_str1, 0, d - 1); 
    ReverseArray(left_rot_str1, d, str1_size - 1); 
    ReverseArray(left_rot_str1, 0, str1_size - 1); 
  
    # Rotating the string d positions to the right 
    ReverseArray(right_rot_str1, 0, str1_size - d - 1); 
    ReverseArray(right_rot_str1, 
                 str1_size - d, str1_size - 1); 
    ReverseArray(right_rot_str1, 0, str1_size - 1); 
  
    # Compairing the rotated strings 
    for i in range(str1_size) :
  
        # If cannot be made equal with left rotation 
        if (left_rot_str1[i] != str2[i]) : 
            left_flag = False
  
        # If cannot be made equal with right rotation 
        if (right_rot_str1[i] != str2[i]) :
            right_flag = False
  
    # If both or any one of the rotations 
    # of str1 were equal to str2 
    if (left_flag or right_flag) :
        return True
    return False
  
# Driver code 
if __name__ == "__main__"
  
    str1 = list("abcdefg"); 
    str2 = list("cdefgab"); 
  
    # d is the rotating factor 
    d = 2
  
    # In case length of str1 < d 
    d = d % len(str1); 
  
    if (RotateAndCheck(str1, str2, d)) :
        print("Yes"); 
    else :
        print("No"); 
  
# This code is contributed by AnkitRai01

chevron_right


Output:

Yes

Time Complexity: O(n)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : AnkitRai01



Article Tags :
Practice Tags :


1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.