代码随想录算法训练营第八天| 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 }

 

posted @ 2023-06-15 21:41  博二爷  阅读(37)  评论(0编辑  收藏  举报