Check if strings are rotations of each other or not | Set 2 - GeeksforGeeks

14 Apr, 2021
Given two strings s1 and s2, check whether s2 is a rotation of s1. Examples: 
Input : ABACD, CDABA
Output : True

Input : GEEKS, EKSGE
Output : True
We have discussed an approach in earlier post which handles substring match as a pattern. In this post, we will be going to use KMP algorithm’s lps (longest proper prefix which is also suffix) construction, which will help in finding the longest match of the prefix of string b and suffix of string a. By which we will know the rotating point, from this point match the characters. If all the characters are matched, then it is a rotation, else not.Below is the basic implementation of the above approach.  
C++
Java
Python3
C#
Javascript
// C++ program to check if// two strings are rotations// of each other#include<bits/stdc++.h>using namespace std;bool isRotation(string a,                string b){  int n = a.length();  int m = b.length();  if (n != m)    return false;   // create lps[] that  // will hold the longest  // prefix suffix values  // for pattern  int lps[n];   // length of the previous  // longest prefix suffix  int len = 0;  int i = 1;     // lps[0] is always 0  lps[0] = 0;   // the loop calculates  // lps[i] for i = 1 to n-1  while (i < n)  {    if (a[i] == b[len])    {      lps[i] = ++len;      ++i;    }    else    {      if (len == 0)      {        lps[i] = 0;        ++i;      }      else      {        len = lps[len - 1];      }    }  }   i = 0;   // Match from that rotating  // point  for (int k = lps[n - 1];           k < m; ++k)  {    if (b[k] != a[i++])      return false;  }  return true;} // Driver codeint main(){  string s1 = "ABACD";  string s2 = "CDABA";  cout << (isRotation(s1, s2) ?           "1" : "0");} // This code is contributed by Chitranayal
// Java program to check if two strings are rotations// of each other.import java.util.*;import java.lang.*;import java.io.*;class stringMatching {    public static boolean isRotation(String a, String b)    {        int n = a.length();        int m = b.length();        if (n != m)            return false;         // create lps[] that will hold the longest        // prefix suffix values for pattern        int lps[] = new int[n];         // length of the previous longest prefix suffix        int len = 0;        int i = 1;        lps[0] = 0; // lps[0] is always 0         // the loop calculates lps[i] for i = 1 to n-1        while (i < n) {            if (a.charAt(i) == b.charAt(len)) {                lps[i] = ++len;                ++i;            }            else {                if (len == 0) {                    lps[i] = 0;                    ++i;                }                else {                    len = lps[len - 1];                }            }        }         i = 0;         // match from that rotating point        for (int k = lps[n - 1]; k < m; ++k) {            if (b.charAt(k) != a.charAt(i++))                return false;        }        return true;    }     // Driver code    public static void main(String[] args)    {        String s1 = "ABACD";        String s2 = "CDABA";         System.out.println(isRotation(s1, s2) ? "1" : "0");    }}
# Python program to check if# two strings are rotations# of each otherdef isRotation(a: str, b: str) -> bool:    n = len(a)    m = len(b)    if (n != m):        return False     # create lps[] that    # will hold the longest    # prefix suffix values    # for pattern    lps = [0 for _ in range(n)]     # length of the previous    # longest prefix suffix    length = 0    i = 1     # lps[0] is always 0    lps[0] = 0     # the loop calculates    # lps[i] for i = 1 to n-1    while (i < n):        if (a[i] == b[length]):            length += 1            lps[i] = length            i += 1        else:            if (length == 0):                lps[i] = 0                i += 1            else:                length = lps[length - 1]    i = 0     # Match from that rotating    # point    for k in range(lps[n - 1], m):        if (b[k] != a[i]):            return False        i += 1    return True # Driver codeif __name__ == "__main__":     s1 = "ABACD"    s2 = "CDABA"    print("1" if isRotation(s1, s2) else "0") # This code is contributed by sanjeev2552
// C# program to check if// two strings are rotations// of each other.using System; class GFG{public static bool isRotation(string a,                              string b){    int n = a.Length;    int m = b.Length;    if (n != m)        return false;     // create lps[] that will    // hold the longest prefix    // suffix values for pattern    int []lps = new int[n];     // length of the previous    // longest prefix suffix    int len = 0;    int i = 1;         // lps[0] is always 0    lps[0] = 0;     // the loop calculates    // lps[i] for i = 1 to n-1    while (i < n)    {        if (a[i] == b[len])        {            lps[i] = ++len;            ++i;        }        else        {            if (len == 0)            {                lps[i] = 0;                ++i;            }            else            {                len = lps[len - 1];            }        }    }     i = 0;     // match from that    // rotating point    for (int k = lps[n - 1]; k < m; ++k)    {        if (b[k] != a[i++])            return false;    }    return true;} // Driver codepublic static void Main(){    string s1 = "ABACD";    string s2 = "CDABA";     Console.WriteLine(isRotation(s1, s2) ?                                     "1" : "0");}} // This code is contributed// by anuj_67.
<script> // javascript program to check if two strings are rotations// of each other.function isRotation(a, b){    var n = a.length;    var m = b.length;    if (n != m)        return false;     // create lps that will hold the longest    // prefix suffix values for pattern    var lps = Array.from({length: n}, (_, i) => 0);     // length of the previous longest prefix suffix    var len = 0;    var i = 1;    lps[0] = 0; // lps[0] is always 0     // the loop calculates lps[i] for i = 1 to n-1    while (i < n) {        if (a.charAt(i) == b.charAt(len)) {            lps[i] = ++len;            ++i;        }        else {            if (len == 0) {                lps[i] = 0;                ++i;            }            else {                len = lps[len - 1];            }        }    }     i = 0;     // match from that rotating point    for (k = lps[n - 1]; k < m; ++k) {        if (b.charAt(k) != a.charAt(i++))            return false;    }    return true;} // Driver codevar s1 = "ABACD";var s2 = "CDABA";document.write(isRotation(s1, s2) ? "1" : "0"); // This code is contributed by shikhasingrajput.</script>
Output:  
1
Time Complexity: O(n) Auxiliary Space: O(n)
vt_m
ukasp
sanjeev2552
shikhasingrajput
rotation
Pattern Searching
Strings
Strings
Pattern Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Check if a string contains uppercase, lowercase, special characters and numeric values
Pattern Searching using Suffix Tree
Finite Automata algorithm for Pattern Searching
Remove leading zeros from a Number given as a string
String matching where one string contains wildcard characters
Reverse a string in Java
Write a program to reverse an array or string
Longest Common Subsequence | DP-4
C++ Data Types
Write a program to print all permutations of a given string