LeetCode每日一题——Day28

459. 重复的子字符串

给定一个非空的字符串 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值