2020 J4: Cyclic Shifts
Problem Description
Thuc likes finding cyclic shifts of strings. A cyclic shift of a
string is obtained by moving characters from the beginning of the
string to the end of the string. We also consider a string to be a
cyclic shift of itself. For example, the cyclic shifts of ABCDE are:
ABCDE, BCDEA, CDEAB, DEABC, and EABCD.
Given some text, T, and a string, S, determine if T contains a cyclic shift of S.
Input Specification
The input will consist of exactly two lines containing only uppercase
letters. The first line will be the text T, and the second line will be
the string S. Each line will contain at most 1000 characters.
For 6 of the 15 available marks, S will be exactly 3 characters in
length.
Output Specification
Output yes if the text, T, contains a cyclic shift of the string,
S. Otherwise, output no.
Sample Input 1:
ABCCDEABAA
ABCDE
Output for Sample Input 1:
yes
Explanation of Output for Sample Input 1
CDEAB is a cyclic shift of ABCDE and it is contained in the
text ABCCDEABAA.
Sample Input 2:
ABCDDEBCAB
ABA
Output for Sample Input 2:
no
Explanation of Output for Sample Input 2
The cyclic shifts of ABA are ABA, BAA, and AAB.
None of these shifts are contained in the text
ABCDDEBCAB.
Solution
text = input()
string = input()
is_found = "no"
for i in range(len(text)-len(string)+1):
text_slice = text[i:i+len(string)]
shift = string
for _ in range(len(shift)):
shift = shift[1:] + shift[0]
if shift == text_slice:
is_found = "yes"
break # stop shifting
if is_found == "yes":
break # stop looking
print(is_found)