题目链接
题目描述
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例
示例1:
输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两次构成。
思路
思路1:暴力匹配
思路2:字符串匹配
我们可以证明如下结论(证明过程暂时省略)
长度为
n的字符串s是字符串t = s + s的子串,并且s在 tt 中的起始位置不为0或n,当且仅当s满足题目的要求。
思路3:KMP算法
next 数组表示最长相等前后缀的长度,设 s 的长度为 len 则,该字符串的最长相等前后缀的长度为 next[len - 1] + 1 。len - (next[len - 1] + 1) 其实表示了重复周期的第一周期,(写出一个符合题意的字符串的 next 数组就能清楚地看到此结论)。
题解
思路2:字符串匹配
class Solution {public:bool repeatedSubstringPattern(string s) {return (s + s).find(s, 1) != s.size();}};
思路3:KMP算法
class Solution {private:void getNext(int* next, const string& t) {next[0] = -1;int j = -1;for (int i = 1; i < (int)t.size(); ++i) {while (j >= 0 && t[i] != t[j + 1]) {j = next[j];}if (t[i] == t[j + 1]) {++j;}next[i] = j;}}public:bool repeatedSubstringPattern(string s) {int len = s.size();if (0 == len) {return false;}int* next = new int[len];getNext(next, s);if (next[len - 1] != -1 && 0 == len % (len - (next[len - 1] + 1))) {return true;}return false;}};
复杂度分析
思路3:KMP算法
- 时间复杂度:
- 空间复杂度:
