# 题目

459. 重复的子字符串 - 力扣(LeetCode)

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

示例 1:

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

示例 2:

  • 输入: "aba"
  • 输出: False

示例 3:

  • 输入: "abcabcabcabc"
  • 输出: True
  • 解释:可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

#

# 分析

# 移动匹配

如果为 ture,则说明字符串里必定有最小组成单元

那么如果把两个字符串组合成新的字符串,然后掐头去尾,如果新字符串里包含原字符串,则说明里面有最小组成串

// 时间复杂度: O (n)
// 空间复杂度: O (1)
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string t = s + s;
        t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾
        if (t.find(s) != std::string::npos) return true; //std::string::npos 是 find 方法的返回值,说明没有找到
        return false;
    }
};

# kmp

代码随想录 (programmercarl.com)