如何检测文本中是否包含目标字符串的循环移位?
解决字符串循环移位检测问题的直观方案
嘿,作为编程初学者碰到这个循环移位检测问题,别慌,我给你讲个超直观还高效的解法,保证一看就懂!
核心思路拆解
首先得搞明白一个关键结论:一个字符串S的所有循环移位,全都会包含在S + S这个拼接后的字符串里!比如你提到的ABCDE,拼接后是ABCDEABCDE——你看,BCDEA(从索引1取5个字符)、CDEAB(索引2)、DEABC(索引3)、EABCD(索引4),所有循环移位都在里面,连原字符串本身也包含在内。
基于这个结论,问题可以简化成两步:
- 第一步:如果S的长度比T长,那T肯定装不下任何S的循环移位,直接输出
no。 - 第二步:如果S长度≤T,我们只需要检查T中是否存在任意一个长度和S相同的子串,且这个子串能在
S+S中找到。如果能找到,说明这个子串是S的循环移位,输出yes;否则输出no。
代码示例(Python)
给你写个最易懂的Python版本,每一步都加了注释:
# 读取输入,去除首尾可能的空白字符 text_T = input().strip() string_S = input().strip() # 先处理长度不匹配的极端情况 if len(string_S) > len(text_T): print("no") else: # 生成包含S所有循环移位的字符串 s_double = string_S + string_S found_shift = False # 遍历T中所有长度等于S的子串 for i in range(len(text_T) - len(string_S) + 1): current_substring = text_T[i:i+len(string_S)] # 检查当前子串是否是S的循环移位(即存在于s_double中) if current_substring in s_double: found_shift = True break # 找到后直接跳出循环,不用继续检查 # 根据结果输出对应内容 print("yes" if found_shift else "no")
测试示例验证
拿你给出的示例输入来测试:
输入:
ABCCDEABAA
ABCDE
拼接后的s_double是ABCDEABCDE,遍历T时会取到子串CDEAB(从索引2开始的5个字符),这个子串存在于s_double中,所以最终输出yes,完全符合预期。
边界情况提示
- 当S和T长度相等时:比如T是
BCDEA、S是ABCDE,此时s_double包含BCDEA,会输出yes。 - 当S长度为1时:比如S是
A,只要T中包含A就输出yes。 - 当T完全不包含S的任何循环移位时:比如T是
XYZ、S是ABC,输出no。
这个方法逻辑简单,对初学者友好,而且效率足够应付题目中的输入场景~
内容的提问来源于stack exchange,提问作者user16627278
相关产品推荐
相关产品推荐

