KMP算法

Posted st-lovaer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法相关的知识,希望对你有一定的参考价值。

很简单的字符串匹配,KMP以及它的一个简单优化。整理成板子。

 1 #include<bits/stdc++.h> 
 2 #define f(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 char s1[100005];
 5 char s2[100005];
 6 int nxt[100005];
 7 //void getnxt(char s[],int nxt[]){
 8 //    int len=strlen(s);
 9 //    nxt[0]=-1;
10 //    int i=0,j=-1;
11 //    while(i<len-1){
12 //        if(j==-1||s[i]==s[j]){
13 //            i++,j++;
14 //            nxt[i]=j;
15 //        }
16 //        else j=nxt[j]; 
17 //    }
18 //}
19 void getnxt(char s[],int nxt[]){
20     int len=strlen(s);
21     nxt[0]=-1;
22     int i=0,j=-1;
23     while(i<len-1){
24         if(j==-1||s[i]==s[j]){
25             i++,j++;
26             if(s[i]==s[j]) nxt[i]=nxt[j];
27             else nxt[i]=j;
28         }
29         else j=nxt[j]; 
30     }
31 }
32 int main(){
33     while(~scanf("%s",s1)){
34         if(s1[0]==#) return 0;
35         scanf("%s",s2);
36         getnxt(s2,nxt);
37         int len1=strlen(s1);
38         int len2=strlen(s2);
39         int k=0;
40         int cnt=0;
41         int i=0;
42         while(i<=len1){
43             while(k<len2&&i<=len1){
44                 if(k==-1||s1[i]==s2[k]){
45                     i++,k++;
46                 }
47                 else{
48                     k=nxt[k];
49                 }
50             }
51             if(k==len2){
52                 cnt++;
53                 k=0;
54             }
55         }
56         printf("%d
",cnt);
57     }
58 }

 

以上是关于KMP算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—串KMP模式匹配算法

Python ---- KMP(博文推荐+代码)

KMP算法及Python代码

KMP算法及Python代码

图解KMP算法原理及其代码分析

Kmp算法Java代码实现