码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2020-01-31 12:46:39      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:pre   name   class   char s   简单   fine   while   strlen   lse   

很简单的字符串匹配,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\n",cnt);
57     }
58 }

 

KMP算法

标签:pre   name   class   char s   简单   fine   while   strlen   lse   

原文地址:https://www.cnblogs.com/St-Lovaer/p/12244223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!