技术问询:判断目标字符串是否为模式串的滑动重复子串
判断目标串是否为模式串的滑动重复子串
这个问题的核心其实可以简化成:判断目标串是否是模式串无限重复后的某个连续子串。下面给你一个简单高效的解决方案,附带上逻辑解释和代码示例。
核心思路
不需要真的生成无限长的字符串(既浪费内存也没必要),只需要用一个小技巧:把模式串拼接成自身的两倍(比如 pattern + pattern),然后检查目标串是不是这个拼接后字符串的子串就行。
为什么两倍就足够?
- 假设模式串长度为n,任何能在无限重复串中找到的目标串,要么完全落在单个模式串里,要么跨越两个相邻的模式串。而
pattern*2已经包含了所有可能的跨边界情况——比如从模式串的第k个字符开始,到下一个模式串的第m个字符结束的所有可能片段,都能在两倍串里找到。
边界情况处理
- 如果模式串是空字符串:只有当目标串也为空时,才返回
True(毕竟空串无限重复还是空串)。 - 如果目标串是空字符串:直接返回
True(空串是任何字符串的子串)。
代码示例(Python)
def is_sliding_repeat(target: str, pattern: str) -> bool: # 处理模式串为空的特殊情况 if not pattern: return not target # 空目标串直接返回True if not target: return True # 检查目标串是否在两倍模式串中 return target in pattern * 2
验证你的示例
用你给出的例子测试这个函数,全部符合预期:
- 模式串
'abcd',目标串'abcdabcd'→ 返回True(完全匹配两倍串) - 目标串
'abcd'→ 返回True(在两倍串的前半部分) - 目标串
'bcdabcdab'→ 返回True(从两倍串的索引1开始截取到索引9就是这个串) - 目标串
'cdabc'→ 返回True(索引2到6的子串) - 目标串
'da'→ 返回True(索引3到4的子串) - 目标串
'ab'/'cd'→ 都能在两倍串中找到,返回True
内容的提问来源于stack exchange,提问作者Nick Legend
相关产品推荐
相关产品推荐

