# 1.9. String rotation ## Given s1 and s2, calculate if s2 is a rotation of s1 using only one call to isSubstring, a function that checks if a string is a substring of another > example: 'waterbottle' is a rotation of 'erbottlewat' ## First idea Need to have the same lengths and same count of characters. ```python from collections import Counter if len(s1) != len(s2) or Counter(s1) != Counter(s2): return 0 if len(s1) < 3 or s1 == s2: return 1 ``` Find s1[0] in s2, index `i`. Check that s2, from i to the end is equal to the substring of s1, and same with the first part. ```python indexes = [i for i, e in enumerate(s2) if e == s1[0]] for idx in indexes: offset = len(s1) - idx if s2[idx:] == s1[:offset] and s2[:idx] == s1[offset:]: return 1 return 0 ``` Finds all occurences of s1[0] in s2, checks if 'wat' == 'wat', and then 'erbottle' == 'erbottle'. Takes O(n) time, O(1) space. No calls to isSubstring, either 2 calls or none. I don't see the point of just one. ## Hints and solution Let s1 be divided into two parts, x and y. s1 = xy and s2 = yx. If we concatenate s2 with itself, s2 = yxxy. In which case s1 is a substring of s2s2. But this takes O(n) time in `isSubstring` and O(n) space. ```python return isSubstring(s1, s2 + s2) ```