KMP算法模板
2021-03-06 08:28
标签:include 文件 count() get int block 一个 str display 模板出自kuangbin的博客 典型应用: 给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 Next[]数组求循环节 KMP算法模板 标签:include 文件 count() get int block 一个 str display 原文地址:https://www.cnblogs.com/duny31030/p/14304217.html概述
(1) 头文件
1 #include
(2) getNext()函数
1 void getNext()
2 {
3 int j,k;
4 j = 0; k = -1; Next[0] = -1;
5 while(j tlen)
6 {
7 if(k == -1 || T[j] == T[k])
8 Next[++j] = ++k;
9 else
10 k = Next[k];
11 }
12 }
(3) 返回模式串T在主串S中首次出现的位置
1 // 返回模式串T在主串S中首次出现的位置
2 // 返回的位置是从0开始的
3 int KMP_Index()
4 {
5 int i = 0,j = 0;
6 getNext();
7
8 while(i tlen)
9 {
10 if(j == -1 || S[i] == T[j])
11 {
12 i++; j++;
13 }
14 else
15 j = Next[j];
16 }
17 if(j == tlen)
18 return i-tlen;
19 else
20 return -1;
21 }
(4) 返回模式串在主串S中出现的次数
1 int KMP_Count()
2 {
3 int ans = 0;
4 int i,j = 0;
5
6 if(slen == 1 && tlen == 1)
7 {
8 if(S[0] == T[0])
9 return 1;
10 else
11 return 0;
12 }
13 getNext();
14 for(i = 0;i )
15 {
16 while(j > 0 && S[i] != T[j])
17 j = Next[j];
18 if(S[i] == T[j])
19 j++;
20 if(j == tlen)
21 {
22 ans++;
23 j = Next[j];
24 }
25 }
26 return ans;
27 }
(5) 全家福
1 #include
(6) 补充
KMP的优化
1 void getNext()
2 {
3 int j,k;
4 j = 0,k = -1,Next[0] = -1;
5 while(j tlen)
6 {
7 if(k == -1 || T[j] == T[k])
8 {
9 j++,k++;
10 if(T[j] == T[k])
11 Next[j] = Next[k]; // 直接走到下一个不相等的地方
12 else
13 Next[j] = k;
14 }
15 else
16 k = Next[k];
17 }
18 }
性质: