1 class Solution {
2 public:
3 vector<int> next;
4 void getNext(string s,vector<int>& next)
5 {
6 int j=0,k=-1;
7 next[0]=-1;
8 while(j<s.size()-1)
9 {
10 if(k==-1 || s[j]==s[k])
11 {
12 j++;
13 k++;
14 if(s[j]==s[k])
15 {
16 next[j]=next[k];
17 }
18 else
19 next[j]=k;
20 }
21 else
22 k=next[k];
23 }
24 }
25 bool kmp(string s,string t,vector<int>& next)
26 {
27 int j=0,k=0;
28 int m=s.size();
29 int n=t.size();
30 while(j<m && k<n)
31 {
32 if(k==-1 || s[j]==t[k])
33 {
34 j++;
35 k++;
36 }
37 else
38 {
39 k=next[k];
40 }
41
42 }
43 if(k>=t.size())
44 return true;
45
46 return false;
47 }
48 bool repeatedSubstringPattern(string s) {
49 int n=s.size();
50 next.resize(n,0);
51 getNext(s,next);
52
53 return kmp(s.substr(1)+s.substr(0,s.size()-1),s,next);
54 }
55 };