You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测文本中是否包含目标字符串的循环移位?

解决字符串循环移位检测问题的直观方案

嘿,作为编程初学者碰到这个循环移位检测问题,别慌,我给你讲个超直观还高效的解法,保证一看就懂!

核心思路拆解

首先得搞明白一个关键结论:一个字符串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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:29:06