To check whether one string is a rotation of another, we can use a very simple and efficient trick that takes advantage of string concatenation.
Imagine we take s1
and rotate its characters in some order. Any such rotation will always be a substring of s1 + s1
(that is, s1
repeated twice).
Example: Let’s say s1 = "waterbottle"
and s2 = "erbottlewat"
. If we concatenate s1
with itself, we get "waterbottlewaterbottle"
. If s2
is truly a rotation of s1
, it will appear somewhere in this doubled string. And in this case, it does!
Different Cases Explained:
- Case 1: Same strings – If
s1
and s2
are exactly the same, then s2
is a rotation of s1
(rotation by 0 characters).
- Case 2: Valid rotation – If
s2
can be formed by rotating s1
, such as moving some characters from the start of s1
to the end, it will appear in s1 + s1
.
- Case 3: Different lengths – If the lengths of
s1
and s2
are not equal, then s2
cannot be a rotation of s1
.
- Case 4: Same length, different characters – If the lengths are equal but the characters don’t align after any rotation, then it’s not a valid rotation.
- Case 5: Empty strings – Two empty strings are considered valid rotations of each other because there’s nothing to rotate.
- Case 6: One string empty – If only one of the strings is empty, then it’s never a valid rotation of the other.
This method is not only simple but also highly efficient because checking for a substring is a fast operation in modern programming languages.
Time Complexity: O(n) where n is the length of the strings (assuming efficient substring check).
Space Complexity: O(n) due to the concatenated string.