(1)问题
力扣—— 459. 重复的子字符串 - 力扣(LeetCode)
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba" 输出: false
示例 3:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
(2)思路
第一种:暴力方法。使用两个for循环来确定重复子串。
第二种:移动匹配,将两个字符串进行拼接,然后移除首尾,如果其中还包含有字符串。则说明是由重复字符串组成。
第三种:KMP算法。创建next数组,如果是由重复字符串组成。那么next数组的最后一个元素值一定是重复字符串的n-1倍。那么只需要字符串长度对剩余字符串求余数即可判断是否为重复字符串组成。
(3)解题流程
1.判断特殊情况,例如字符串长度为0。
2.构造next数组。
3.获取字符串长度。
4.判断next数组最后一个元素值大于0并且数组长除以剩余字符串长度的余数是否为0
5.如果是返回true。不是返回false。
代码实现:
void getNext(int* next,const string& s)
{
int j=0;
next[0]=0;
for(int i=1;i<s.size();i++)
{
while(j>0&&s[i]!=s[j])
{
j = next[j-1];
}
if(s[i]==s[j])
{
j++;
}
next[i]=j;
}
}
bool repeatedSubstringPattern(string s) {
if(s.size()==0) return false;
int next[s.size()];
getNext(next,s);
int len = s.size();
if(next[len-1]>0&&len%(len-next[len-1])==0)
{
return true;
}
return false;
}