38 lines
1.3 KiB
Markdown
38 lines
1.3 KiB
Markdown
# 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)
|
|
``` |