重复子串模式
字数 723 2025-10-28 00:29:09
重复子串模式
题目描述:给定一个字符串 s,检查它是否可以通过由它的一个子串重复多次构成。例如,输入 "abab",返回 true,因为可以由 "ab" 重复两次构成;输入 "abc",返回 false。
解题过程:
-
问题理解:我们需要判断整个字符串 s 是否由某个更短的子串重复多次拼接而成。关键在于找到这个潜在的重复单元。
-
关键观察:如果字符串 s 可以由子串 t 重复构成,那么:
- s 的长度一定是 t 长度的整数倍
- 将两个 s 连接起来形成新字符串 s + s
- 去掉新字符串的首尾字符后,原字符串 s 应该仍然出现在新字符串中
-
算法步骤:
a. 将原字符串 s 复制一份,拼接成新字符串 s + s
b. 去掉新字符串的首字符和尾字符(避免直接匹配到原字符串)
c. 在新字符串中查找原字符串 s
d. 如果找到,说明 s 可以由子串重复构成;否则不能 -
原理分析:假设 s = t + t + ... + t(共 k 次,k ≥ 2)
- s + s = t + t + ... + t(共 2k 次)
- 去掉首尾字符后,剩下的字符串中仍然包含完整的 s
- 如果 s 不能由子串重复构成,那么在去掉首尾字符的 s + s 中不会找到完整的 s
-
举例验证:
- s = "abab":s + s = "abababab"
- 去掉首尾:"bababa"
- 在 "bababa" 中查找 "abab":找到,返回 true
- s = "abc":s + s = "abcabc"
- 去掉首尾:"bcab"
- 在 "bcab" 中查找 "abc":未找到,返回 false
- s = "abab":s + s = "abababab"
-
实现细节:可以使用字符串查找函数(如 KMP)来高效判断子串存在性,时间复杂度为 O(n)。