Difficulty | Source | Tags | |
---|---|---|---|
Easy |
160 Days of Problem Solving |
|
The problem can be found at the following link: Problem Link
You are given two strings of equal lengths, s1
and s2
. The task is to check if s2
is a rotated version of s1
.
Rotation means that the string s2
can be formed by shifting the characters of s1
cyclically.
Note: The characters in the strings are in lowercase.
Input:
s1 = "abcd", s2 = "cdab"
Output:
true
Explanation:
After two right rotations, s1
becomes equal to s2
.
Input:
s1 = "aab", s2 = "aba"
Output:
true
Explanation:
After one left rotation, s1
becomes equal to s2
.
Input:
s1 = "abcd", s2 = "acbd"
Output:
false
Explanation:
The strings are not rotations of each other.
$(1 \leq \text{s1.size(), s2.size()} \leq 10^5)$
-
String Concatenation and Substring Check:
- The solution relies on the fact that a rotated version of
s1
will always be a substring ofs1 + s1
. - By concatenating
s1
with itself, all possible rotations ofs1
are included in the resulting string. - Then, we check if
s2
is a substring of the concatenated string.
- The solution relies on the fact that a rotated version of
-
Edge Cases:
- If the lengths of
s1
ands2
are different, they cannot be rotations. - Strings with only one character are trivially rotations if they are equal.
- If the lengths of
-
Steps:
- Check if the lengths of
s1
ands2
are equal. - Concatenate
s1
with itself to create a new string. - Use efficient substring search techniques like
strstr
orKMP
to check ifs2
is present in the concatenated string.
- Check if the lengths of
- Expected Time Complexity: (O(n)), where (n) is the length of the string. The concatenation takes (O(n)), and the substring search also runs in (O(n)) using algorithms like KMP.
- Expected Auxiliary Space Complexity: (O(n)), as concatenating the string requires additional space for storing (s1 + s1).
int areRotations(char* s1, char* s2) {
if (strlen(s1) != strlen(s2)) return 0;
char* temp = (char*)malloc(2 * strlen(s1) + 1);
strcpy(temp, s1);
strcat(temp, s1);
int result = (strstr(temp, s2) != NULL);
free(temp);
return result;
}
class Solution {
public:
bool areRotations(string &s1, string &s2) {
if (s1.length() != s2.length()) return false;
string temp = s1 + s1;
return (temp.find(s2) != string::npos);
}
};
class Solution {
public static boolean areRotations(String s1, String s2) {
if (s1.length() != s2.length()) return false;
String temp = s1 + s1;
return kmpSearch(temp, s2);
}
private static boolean kmpSearch(String text, String pattern) {
int[] lps = computeLPSArray(pattern);
int i = 0, j = 0;
while (i < text.length()) {
if (text.charAt(i) == pattern.charAt(j)) {
i++;
j++;
if (j == pattern.length()) {
return true;
}
} else {
if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
return false;
}
private static int[] computeLPSArray(String pattern) {
int[] lps = new int[pattern.length()];
int len = 0, i = 1;
while (i < pattern.length()) {
if (pattern.charAt(i) == pattern.charAt(len)) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
}
class Solution:
def areRotations(self, s1, s2):
if len(s1) != len(s2):
return False
temp = s1 + s1
return s2 in temp
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐