给定一个非空的字符串
s
,检查是否可以通过由它的一个子串重复多次构成。示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2:
输入: s = "aba" 输出: false示例 3:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
思路分析:
字符串匹配法
对于字符串 s,我们设有符合条件的子串 a,使得 s 可以写成 aaa…aaa 的形式。
我们移除字符串前 n 个字符(完整的子串 a),再将这些移除的字符添加到字符串 s 的末尾,得到的新字符串任然为 s。那么如果将两个 s 连在一起,并移除第一个和最后一个字符,那么得到的字符串一定包含 s,即 s 是它的一个子串。
因此我们可以考虑上述方法。
但注意到的是:
我们证明的是如果 s 满足题目要求,那么 s 有这样的性质,而我们使用的方法却是如果 s 有这样的性质,那么 s 满足题目要求。因此,只证明了充分性是远远不够的,我们还需要证明必要性。
代码实现:
假设我们已经完成了证明。会在文末给出方法的必要性证明供自行阅读。
class Solution {
public boolean repeatedSubstringPattern(String s) {
return (s + s).indexOf(s, 1) != s.length();
}
}
提交结果:
129 / 129 个通过测试用例
状态:通过
执行用时: 100 ms
内存消耗: 41.6 MB
提交时间:17 分钟前
下面给出方法必要性的数学证明:
证明来自 leetcode 官方题解:重复的子字符串 – 重复的子字符串 – 力扣(LeetCode)