Open In App

Check if Strings Are Rotations of Each Other

Last Updated : 25 Oct, 2024
Summarize
Comments
Improve
Suggest changes
Like Article
Like
Save
Share
Report
News Follow

Given two string s1 and s2 of same length, the task is to check whether s2 is a rotation of s1.

Examples: 

Input: s1 = “abcd”, s2 = “cdab”
Output: true
Explanation: After 2 right rotations, s1 will become equal to s2.

Input: s1 = “aab”, s2 = “aba”
Output: true
Explanation: After 1 left rotation, s1 will become equal to s2.

Input: s1 = “abcd”, s2 = “acbd”
Output: false
Explanation: Strings are not rotations of each other.

[Naive Approach] Generating all rotations – O(n^2) Time and O(1) Space

The idea is to generate all possible rotations of the first string and check if any of these rotations match the second string. If any rotation matches, the two strings are rotations of each other, otherwise they are not.

C++
// C++ program to check two string for rotation
// by generating all rotations

#include <iostream>
using namespace std;

// Function to check if s1 and s2 are rotations of each other
bool areRotations(string &s1, string &s2) {
    int n = s1.size();
      
      // generate and check all possible rotations of s1
    for (int i = 0; i < n; ++i) {
      
          // if current rotation is equal to s2 return true
        if (s1 == s2)
            return true;
      
          // right rotate s1
        char last = s1.back();
        s1.pop_back();
        s1 = last + s1;
    }
    return false;
}

int main() {
    string s1 = "aab";
    string s2 = "aba";

    cout << (areRotations(s1, s2) ? "true" : "false");
    return 0;
}
C
// C program to check two strings for rotation
// by generating all rotations
#include <stdio.h>
#include <string.h>

// Function to check if s1 and s2 are rotations of each other
int areRotations(char s1[], char s2[]) {
    int n = strlen(s1);

    // Generate and check all possible rotations of s1
    for (int i = 0; i < n; ++i) {
        
        // If current rotation is equal to s2, return true
        if (strcmp(s1, s2) == 0)
            return 1;

        // Right rotate s1
        char last = s1[n-1];
        for (int j = n-1; j > 0; j--) {
            s1[j] = s1[j-1];
        }
        s1[0] = last;
    }
    return 0;
}

int main() {
    char s1[] = "aab";
    char s2[] = "aba";

    printf("%s", areRotations(s1, s2) ? "true" : "false");
    return 0;
}
Java
// Java program to check two strings for rotation
// by generating all rotations
class GfG {
    
    // Function to check if s1 and s2 are rotations of each other
    static boolean areRotations(String s1, String s2) {
        int n = s1.length();

        // Generate and check all possible rotations of s1
        for (int i = 0; i < n; ++i) {
            
            // If current rotation is equal to s2, return true
            if (s1.equals(s2)) {
                return true;
            }

            // Right rotate s1
            char last = s1.charAt(s1.length() - 1);
            s1 = last + s1.substring(0, s1.length() - 1);
        }
        return false;
    }

    public static void main(String[] args) {
        String s1 = "aab";
        String s2 = "aba";

        System.out.println(areRotations(s1, s2));
    }
}
Python
# Python program to check two strings for rotation
# by generating all rotations

# Function to check if s1 and s2 are rotations of each other
def areRotations(s1, s2):
    n = len(s1)

    # Generate and check all possible rotations of s1
    for _ in range(n):
        
        # If current rotation is equal to s2, return true
        if s1 == s2:
            return True

        # Right rotate s1
        s1 = s1[-1] + s1[:-1]

    return False

if __name__ == "__main__":
    s1 = "aab"
    s2 = "aba"

    print("true" if areRotations(s1, s2) else "false")
C#
// C# program to check two strings for rotation
// by generating all rotations
using System;

class GfG {

    // Function to check if s1 and s2 are rotations of each other
    static bool areRotations(string s1, string s2) {
        int n = s1.Length;

        // Generate and check all possible rotations of s1
        for (int i = 0; i < n; ++i) {
            
            // If current rotation is equal to s2, return true
            if (s1 == s2) {
                return true;
            }

            // Right rotate s1
            char last = s1[s1.Length - 1];
            s1 = last + s1.Substring(0, s1.Length - 1);
        }
        return false;
    }

    static void Main() {
        string s1 = "aab";
        string s2 = "aba";

        Console.WriteLine(areRotations(s1, s2) ? "true" : "false");
    }
}
JavaScript
// JavaScript program to check two strings for rotation
// by generating all rotations

// Function to check if s1 and s2 are rotations of each other
function areRotations(s1, s2) {
    let n = s1.length;

    // Generate and check all possible rotations of s1
    for (let i = 0; i < n; i++) {
        
        // If current rotation is equal to s2, return true
        if (s1 === s2) {
            return true;
        }

        // Right rotate s1
        let last = s1[s1.length - 1];
        s1 = last + s1.slice(0, s1.length - 1);
    }
    return false;
}

// Driver Code
let s1 = "aab";
let s2 = "aba";

console.log(areRotations(s1, s2) ? "true" : "false");

Output
true

[Expected Approach] Using KMP Algorithm – O(n) Time and O(n) Space

The idea is that when a string is concatenated with itself, all possible rotations of the string will naturally appear as substrings within this concatenated string. To determine if another string is a rotation of the first, we can use KMP Algorithm to check if the second string exists as a substring in the concatenated form of the first string.


C++
// C++ program to check if two given strings
// are rotations of each other using KMP Algorithm

#include <iostream>
#include <vector>
using namespace std;

vector<int> computeLPSArray(string& pat) {
      int n = pat.size();
      vector<int> lps(n);
  
    // Length of the previous longest prefix suffix
    int len = 0;

    // lps[0] is always 0
    lps[0] = 0;

    // loop calculates lps[i] for i = 1 to n-1
    int i = 1;
    while (i < n) {
      
        // If the characters match, increment len 
        // and extend the matching prefix
        if (pat[i] == pat[len]) {
            len++;
            lps[i] = len;
            i++;
        }
      
        // If there is a mismatch
        else {
          
            // If len is not zero, update len to
            // last known prefix length
            if (len != 0) {
                len = lps[len - 1];
            }
          
            // No prefix matches, set lps[i] = 0
            // and move to the next character
            else {
                lps[i] = 0;
                i++;
            }
        }
    }
      return lps;
}


// Function to check if s1 and s2 are rotations of each other
bool areRotations(string &s1, string &s2) {
      string txt = s1 + s1;
      string pat = s2;
      
      // search the pattern string s2 in the concatenation string 
      int n = txt.length();
    int m = pat.length();

    // Create lps[] that will hold the longest prefix suffix
    // values for pattern
    vector<int> lps = computeLPSArray(pat);
  
    int i = 0; 
    int j = 0;
    while (i < n) {
        if (pat[j] == txt[i]) {
            j++;
            i++;
        }

        if (j == m) {
            return true;
        }

        // Mismatch after j matches
        else if (i < n && pat[j] != txt[i]) {

            // Do not match lps[0..lps[j-1]] characters,
            // they will match anyway
            if (j != 0)
                j = lps[j - 1];
            else
                i = i + 1;
        }
    }
    return false;
}

int main() {
    string s1 = "aab"; 
      string s2 = "aba";
      
    cout << (areRotations(s1, s2) ? "true" : "false");
}
C
// C program to check if two given strings are
// rotations of  each other using KMP Algorithm

#include <stdio.h>
#include <string.h>

int* computeLPSArray(char* pat) {
    int n = strlen(pat);
    int* lps = (int*)malloc(n * sizeof(int));
  
    // Length of the previous longest prefix suffix
    int len = 0;

    // lps[0] is always 0
    lps[0] = 0;

    // loop calculates lps[i] for i = 1 to n-1
    int i = 1;
    while (i < n) {
      
        // If the characters match, increment len 
        // and extend the matching prefix
        if (pat[i] == pat[len]) {
            len++;
            lps[i] = len;
            i++;
        }
      
        // If there is a mismatch
        else {
          
            // If len is not zero, update len to
            // last known prefix length
            if (len != 0) {
                len = lps[len - 1];
            }
          
            // No prefix matches, set lps[i] = 0
            // and move to the next character
            else {
                lps[i] = 0;
                i++;
            }
        }
    }
    return lps;
}


// Function to check if s1 and s2 are rotations of each other
int areRotations(char *s1, char *s2) {
    char* txt = (char*)malloc(strlen(s1) * 2 + 1);
    strcpy(txt, s1);
    strcat(txt, s1);
    
    char* pat = s2;
    
    // search the pattern string s2 in the concatenated string 
    int n = strlen(txt);
    int m = strlen(pat);

    // Create lps[] that will hold the longest prefix suffix
    // values for pattern
    int* lps = computeLPSArray(pat);
  
    int i = 0; 
    int j = 0;
    while (i < n) {
        if (pat[j] == txt[i]) {
            j++;
            i++;
        }

        if (j == m) {
            return 1; 
        }

        // Mismatch after j matches
        else if (i < n && pat[j] != txt[i]) {

            // Do not match lps[0..lps[j-1]] characters,
            // they will match anyway
            if (j != 0)
                j = lps[j - 1];
            else
                i = i + 1;
        }
    }
    return 0;
}

int main() {
    char s1[] = "aab"; 
    char s2[] = "aba";
    
    printf("%s", (areRotations(s1, s2) ? "true" : "false"));
    return 0;
}
Java
// Java program to check if two given strings are rotations 
// of each other using KMP Algorithm

import java.util.Arrays;

class GfG {
    
    static int[] computeLPSArray(String pat) {
        int n = pat.length();
        int[] lps = new int[n];
      
        // Length of the previous longest prefix suffix
        int len = 0;

        // lps[0] is always 0
        lps[0] = 0;

        // loop calculates lps[i] for i = 1 to n-1
        int i = 1;
        while (i < n) {
          
            // If the characters match, increment len 
            // and extend the matching prefix
            if (pat.charAt(i) == pat.charAt(len)) {
                len++;
                lps[i] = len;
                i++;
            }
          
            // If there is a mismatch
            else {
              
                // If len is not zero, update len to
                // last known prefix length
                if (len != 0) {
                    len = lps[len - 1];
                }
              
                // No prefix matches, set lps[i] = 0
                // and move to the next character
                else {
                    lps[i] = 0;
                    i++;
                }
            }
        }
        return lps;
    }

    // Function to check if s1 and s2 are rotations of each other
    static boolean areRotations(String s1, String s2) {
        String txt = s1 + s1;
        String pat = s2;
        
        // search the pattern string s2 in the concatenation string 
        int n = txt.length();
        int m = pat.length();

        // Create lps[] that will hold the longest prefix suffix
        // values for pattern
        int[] lps = computeLPSArray(pat);
      
        int i = 0; 
        int j = 0;
        while (i < n) {
            if (pat.charAt(j) == txt.charAt(i)) {
                j++;
                i++;
            }

            if (j == m) {
                return true;
            }

            // Mismatch after j matches
            else if (i < n && pat.charAt(j) != txt.charAt(i)) {

                // Do not match lps[0..lps[j-1]] characters,
                // they will match anyway
                if (j != 0)
                    j = lps[j - 1];
                else
                    i = i + 1;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        String s1 = "aab"; 
        String s2 = "aba";
        
        System.out.println(areRotations(s1, s2) ? "true" : "false");
    }
}
Python
# Python program to check if two given strings are 
# rotations of each other using KMP Algorithm 

def computeLPSArray(pat):
    n = len(pat)
    lps = [0] * n
  
    # Length of the previous longest prefix suffix
    patLen = 0

    # lps[0] is always 0
    lps[0] = 0

    # loop calculates lps[i] for i = 1 to n-1
    i = 1
    while i < n:
      
        # If the characters match, increment len 
        # and extend the matching prefix
        if pat[i] == pat[patLen]:
            patLen += 1
            lps[i] = patLen
            i += 1
      
        # If there is a mismatch
        else:
          
            # If len is not zero, update len to
            # last known prefix length
            if patLen != 0:
                patLen = lps[patLen - 1]
            # No prefix matches, set lps[i] = 0
            # and move to the next character
            else:
                lps[i] = 0
                i += 1
    return lps


# Function to check if s1 and s2 are rotations of each other
def areRotations(s1, s2):
    txt = s1 + s1
    pat = s2
    
    # search the pattern string s2 in the concatenation string 
    n = len(txt)
    m = len(pat)

    # Create lps[] that will hold the longest prefix suffix
    # values for pattern
    lps = computeLPSArray(pat)
  
    i = 0 
    j = 0
    while i < n:
        if pat[j] == txt[i]:
            j += 1
            i += 1

        if j == m:
            return True

        # Mismatch after j matches
        elif i < n and pat[j] != txt[i]:
            # Do not match lps[0..lps[j-1]] characters,
            # they will match anyway
            if j != 0:
                j = lps[j - 1]
            else:
                i += 1
    return False

if __name__ == "__main__":
    s1 = "aab" 
    s2 = "aba"
    
    print("true" if areRotations(s1, s2) else "false")
C#
// C# program to check if two given strings are rotations
// of each other using KMP Algorithm

using System;
using System.Collections.Generic;

class GfG {
    static int[] ComputeLPSArray(string pat) {
        int n = pat.Length;
        int[] lps = new int[n];
  
        // Length of the previous longest prefix suffix
        int len = 0;

        // lps[0] is always 0
        lps[0] = 0;

        // loop calculates lps[i] for i = 1 to n-1
        int i = 1;
        while (i < n) {
          
            // If the characters match, increment len 
            // and extend the matching prefix
            if (pat[i] == pat[len]) {
                len++;
                lps[i] = len;
                i++;
            }
            
            // If there is a mismatch
            else {
                
                // If len is not zero, update len to
                // last known prefix length
                if (len != 0) {
                    len = lps[len - 1];
                }
                
                // No prefix matches, set lps[i] = 0
                // and move to the next character
                else {
                    lps[i] = 0;
                    i++;
                }
            }
        }
        return lps;
    }

    // Function to check if s1 and s2 are rotations of each other
    static bool AreRotations(string s1, string s2) {
        string txt = s1 + s1;
        string pat = s2;
        
        // search the pattern string s2 in the concatenation string 
        int n = txt.Length;
        int m = pat.Length;

        // Create lps[] that will hold the longest prefix suffix
        // values for pattern
        int[] lps = ComputeLPSArray(pat);
  
        int i = 0; 
        int j = 0;
        while (i < n) {
            if (pat[j] == txt[i]) {
                j++;
                i++;
            }

            if (j == m)  {
                return true;
            }

            // Mismatch after j matches
            else if (i < n && pat[j] != txt[i]) {
              
                // Do not match lps[0..lps[j-1]] characters,
                // they will match anyway
                if (j != 0)
                    j = lps[j - 1];
                else
                    i++;
            }
        }
        return false;
    }

    static void Main() {
        string s1 = "aab"; 
        string s2 = "aba";
        
        Console.WriteLine(AreRotations(s1, s2) ? "true" : "false");
    }
}
JavaScript
// JavaScript program to check if two given strings
// are rotations of each other using KMP Algorithm

function computeLPSArray(pat) {
    let n = pat.length;
    let lps = new Array(n).fill(0);
  
    // Length of the previous longest prefix suffix
    let len = 0;

    // lps[0] is always 0
    lps[0] = 0;

    // loop calculates lps[i] for i = 1 to n-1
    let i = 1;
    while (i < n) {
      
        // If the characters match, increment len 
        // and extend the matching prefix
        if (pat[i] === pat[len]) {
            len++;
            lps[i] = len;
            i++;
        }
      
        // If there is a mismatch
        else {
          
            // If len is not zero, update len to
            // last known prefix length
            if (len !== 0) {
                len = lps[len - 1];
            }
          
            // No prefix matches, set lps[i] = 0
            // and move to the next character
            else {
                lps[i] = 0;
                i++;
            }
        }
    }
    return lps;
}

// Function to check if s1 and s2 are rotations of each other
function areRotations(s1, s2) {
    let txt = s1 + s1;
    let pat = s2;
    
    // search the pattern string s2 in the concatenation string 
    let n = txt.length;
    let m = pat.length;

    // Create lps[] that will hold the longest prefix suffix
    // values for pattern
    let lps = computeLPSArray(pat);
  
    let i = 0; 
    let j = 0;
    while (i < n) {
        if (pat[j] === txt[i]) {
            j++;
            i++;
        }

        if (j === m) {
            return true;
        }

        // Mismatch after j matches
        else if (i < n && pat[j] !== txt[i]) {

            // Do not match lps[0..lps[j-1]] characters,
            // they will match anyway
            if (j !== 0)
                j = lps[j - 1];
            else
                i++;
        }
    }
    return false;
}

// Driver Code
const s1 = "aab"; 
const s2 = "aba";

console.log(areRotations(s1, s2) ? "true" : "false");

Output
true

[Alternate Approach] Using Built-in Method

This approach is similar to the previous approach, but here we are using built-in methods to find a pattern string inside other string.

C++
// C++ program to check if two given strings
// are rotations of  each other
#include <iostream>
using namespace std;

// Function to check if s1 and s2 are rotations of each other
bool areRotations(string &s1, string &s2) {
      s1 += s1;
  
      // find s2 in concatenated string
      return s1.find(s2) != string::npos;
}

int main() {
    string s1 = "aab"; 
      string s2 = "aba";
      
    cout << (areRotations(s1, s2) ? "true" : "false");
}
C
// C program to check if two given strings are rotations of each other
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Function to check if s1 and s2 are rotations of each other
int areRotations(char* s1, char* s2) {
  
    // Concatenate s1 with itself
    int len = strlen(s1);
    char* concat = (char*)malloc(2 * len + 1);
    strcpy(concat, s1);
    strcat(concat, s1);

    // find s2 in concatenated string
    int result = strstr(concat, s2) != NULL;
    free(concat);
    return result;
}

int main() {
    char s1[] = "aab";
    char s2[] = "aba";

    printf("%s\n", areRotations(s1, s2) ? "true" : "false");
    return 0;
}
Java
// Java program to check if two given strings are rotations of each other
class GfG {

    // Function to check if s1 and s2 are rotations of each other
    static boolean areRotations(String s1, String s2) {
        s1 = s1 + s1;

        // find s2 in concatenated string
        return s1.contains(s2);
    }

    public static void main(String[] args) {
        String s1 = "aab";
        String s2 = "aba";

        System.out.println(areRotations(s1, s2));
    }
}
Python
# Python program to check if two given strings are rotations of each other

# Function to check if s1 and s2 are rotations of each other
def areRotations(s1, s2):
    s1 = s1 + s1

    # find s2 in concatenated string
    return s2 in s1

if __name__ == "__main__":
    s1 = "aab"
    s2 = "aba"

    print("true" if areRotations(s1, s2) else "false")
C#
// C# program to check if two given strings are rotations of each other
using System;

class GfG {

    // Function to check if s1 and s2 are rotations of each other
    static bool areRotations(string s1, string s2) {
        s1 = s1 + s1;

        // find s2 in concatenated string
        return s1.Contains(s2);
    }

    static void Main() {
        string s1 = "aab";
        string s2 = "aba";

        Console.WriteLine(areRotations(s1, s2) ? "true" : "false");
    }
}
JavaScript
// JavaScript program to check if two given strings are rotations of each other

// Function to check if s1 and s2 are rotations of each other
function areRotations(s1, s2) {
    s1 += s1;

    // find s2 in concatenated string
    return s1.includes(s2);
}

// driver code
const s1 = "aab";
const s2 = "aba";

console.log(areRotations(s1, s2) ? "true" : "false");

Output
true

Note: Time complexity of built-in methods differs in different languages.




Next Article
Article Tags :
Practice Tags :

Similar Reads

three90RightbarBannerImg
  翻译: