AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 459. Repeated Substring Pattern    原题链接    简单

作者: 作者的头像   wzc1995 ,  2018-06-30 14:51:31 ,  所有人可见 ,  阅读 1936


3


题目描述

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过 10000。

样例

输入:"abab"

输出:True

解释:可由子字符串 "ab" 重复两次构成。
输入:"aba"

输出:False
输入:"abcabcabcabc"

输出:True

解释:可由子字符串 "abc" 重复四次构成,或者子字符串 "abcabc" 重复两次构成。

算法

(KMP) $O(n)$
  1. 利用 KMP 算法求出原数组的 next 数组,next[i] 表示最长的 [0, next[i]] 的子串和以 s[i] 为结尾后缀相等的长度。
  2. 利用 next数组的性质,考虑 next[n - 1] 即整个字符串的后缀和前缀相等的最大长度,若 next[n - 1] 不为 -1 且 n % (n - next[n - 1] - 1) == 0,则可以得到一个无重叠的循环节。可以根据 next 数组的性质进行证明正确性。

时间复杂度

  • 时间复杂度和 KMP 相等,为 $O(n)$。

空间复杂度

  • 需要额外 $O(n)$ 的空间存储 next 数组。

C++ 代码

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        vector<int> next(n);
        next[0] = -1;
        int j = -1;

        for (int i = 1; i < n; i++) {
            while (j >= 0 && s[i] != s[j + 1]) j = next[j];
            if (s[i] == s[j + 1])
                j++;
            next[i] = j;
        }

        return next[n - 1] != -1 && n % (n - next[n - 1] - 1) == 0;
    }
};

4 评论


用户头像
贺谦   2020-07-30 17:40         踩      回复

n % (n - next[n - 1] - 1) == 0这个是怎么得出来的呀

用户头像
wzc1995   2020-08-02 12:08         踩      回复

这个可以手动推一下


用户头像
T-SHLoRk   2019-08-04 14:53         踩      回复

同九教,汝何秀

用户头像
greg666   2020-10-31 11:30         踩      回复

优秀


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息