kmp算法(个数&次数)

kmp模板:
 1 // p为模式串,s为主串
 2 
 3 #include <bits/stdc++.h>
 4 using namespace std;
 5 int nxt[1000005];
 6 char s[1000006], p[1000000];
 7 void GetNext()
 8 {
 9     int pLen = strlen(p);
10     nxt[0] = -1;
11     int len = -1;
12     int j = 0;
13     while (j < pLen)
14     {
15         //p[k]表示前缀,p[j]表示后缀
16         if (len == -1 || p[j] == p[len])
17         {
18             ++len;
19             ++j;
20             nxt[j] = len;
21         }
22         else
23         {
24             len = nxt[len];
25         }
26     }
27 }
28 int KmpSearch()
29 {
30     int i = 0;
31     int j = 0;
32     int sLen = strlen(s);
33     int pLen = strlen(p);
34     int cnt = 0;
35     while (i < sLen && j < pLen)
36     {
37         if (j == -1 || s[i] == p[j])
38         {
39             i++;
40             j++;
41         }
42         else
43             j = nxt[j];
44     }
45     if (j == pLen)
46         return i - j;
47     else
48         return -1;
49 }
50 int main()
51 {
52     while (cin >> s >> p)
53     {
54         memset(nxt, 0, sizeof nxt);
55         GetNext();
56         cout << KmpSearch() << endl;
57     }
58     return 0;
59 }
View Code
 
1.求字串个数,只需要小改一下。
 1 int cnt = 0;
 2     while (i < sLen)  // 1.j要一直往后移,所以不需要 j<pLen
 3     {
 4         if (j == -1 || s[i] == p[j])
 5         {
 6             i++;
 7             j++;
 8         }
 9         else j = nxt[j];
10         if (j == pLen) {cnt++;j++}; // 2.相等就直接加
11     }
12     return cnt;

 

2.求字串出现次数,在上面的模板中一句更改为

 if (j == pLen){ cnt++; j=nxt[j]; } 

posted @ 2019-12-15 20:21  PeacefulGemini  阅读(609)  评论(0)    收藏  举报
回顶部