此题来自今日头条2017秋招真题,题目叫String Shifting,其实就是求字符串中循环节个数
题目描述:
我们规定对一个字符串的shift操作如下:
shift(“ABCD”, 0) = “ABCD”
shift(“ABCD”, 1) = “BCDA”
shift(“ABCD”, 2) = “CDAB”
换言之, 我们把最左侧的N个字符剪切下来, 按序附加到了右侧。
给定一个长度为n的字符串,我们规定最多可以进行n次向左的循环shift操作。如果shift(string, x) = string (0<= x <n), 我们称其为一次匹配(match)。求在shift过程中出现匹配的次数。
输入
输入仅包括一个给定的字符串,只包含大小写字符。 | 样例输入
byebyebye |
输出
输出仅包括一行,即所求的匹配次数。 | 样例输出
3 |
时间限制C/C++语言:1000MS其它语言:3000MS | 内存限制C/C++语言:65536KB其它语言:589824KB |
思路:
大体思路就是从最小单位1依次从左往右截取字符串,判断截取的第1个字符串是否与第2,3,...,n个的相同长度的字符串是否相同如果有一个不相同直接break跳出循环,将最小单位加1继续执行上述循环。如果在某个最小单位内,上述循环全部通过,那么直接输出字符串长度除以最小单位的值。如果最小单位等于字符串的长度的一半时程序还没有输出,那么说明这个字符串只有1个循环节,就是本身,那么输出1就可以了。
答案:
string = input()
l = len(string)
flag = 0
for i in range(l//2 + 1):
if l % (i+1) == 0:
r = l//(i+1)
for j in range(1, r):
if string[:(i+1)] != string[j*(i+1):(j+1)*(i+1)]:
break
if j == r - 1:
flag = 1
if flag == 1:
print(r)
break
if i == l//2:
print(1)
以上为我的愚见,如果哪个小伙伴有更好的方法,欢迎讨论呀!