代码随想录算法训练营第八天| 28. 实现 strStr() 459.重复的子字符串
28. 实现 strStr()
难点:
1,制作KMP算法
2,next 数组要求的是,找到的下标:0/ s[i]==s[j]才可以跳出来
代码:
1 vector<int> getNextList(string needle) 2 { 3 vector<int> next(needle.size()); 4 int j = 0; 5 next[0]=0; 6 7 for (int i = 1; i < needle.size(); i++) 8 { 9 while (j > 0 && needle[j] != needle[i]) 10 { 11 j = next[j - 1]; 12 } 13 14 if (needle[i] == needle[j]) 15 { 16 j++; 17 } 18 19 next[i] = j; 20 } 21 22 return next; 23 } 24 25 26 int strStr(string haystack, string needle) 27 { 28 if (needle.size() == 0) { 29 return 0; 30 } 31 32 auto next = getNextList(needle); 33 34 int i = 0; 35 for (int j = 0; j < haystack.size(); j++) 36 { 37 while (i > 0 && needle[i] != haystack[j]) 38 { 39 40 i = next[i - 1]; 41 cout << i; 42 43 } 44 45 if (haystack[j] == needle[i]) 46 { 47 i++; 48 } 49 50 if (i == needle.size()) 51 return j - needle.size() + 1; 52 } 53 54 return -1; 55 }
459.重复的子字符串
注意:
1,KMP中 next数组里,如果最后一个数值不为0,且len-next()==最小重复字符串
2,只要两个长度可以整除,那么就是重复子字符串
代码:
1 bool repeatedSubstringPattern(string s) 2 { 3 if (s.size()== 0) 4 return false; 5 6 vector<int>next(s.size()); 7 int j = 0; 8 next[0] = 0; 9 for (int i = 1; i < s.size(); i++) 10 { 11 while (j > 0 && s[j] != s[i]) 12 { 13 j = next[j - 1]; 14 } 15 16 if (s[j] == s[i]) 17 { 18 j++; 19 } 20 21 next[i] = j; 22 } 23 24 //最小字串,不是由0组成的,而是最长相等前后缀的差值 25 int subStrlen = s.size() - next[s.size() -1]; 26 if (next[s.size() - 1] !=0&&s.size() % subStrlen == 0) 27 return true; 28 return false; 29 }