首页 > 其他 > 详细

KMP

时间:2019-10-20 20:12:31      阅读:68      评论:0      收藏:0      [点我收藏+]

 

技术分享图片

 

 技术分享图片

 

 KMP:(1) 求 字符串前缀 与 后缀 匹配的字符数

             (2) next[0] = 0, next[1] = 0; 把求出的长度后移一位

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e5 + 7;
 4 char p[maxn], s[maxn];
 5 int n,m;
 6 int Nextnum[maxn];
 7 void GetFail(char p[], int plen)
 8 {
 9     Nextnum[0] = 0, Nextnum[1] = 0;
10     for(int i = 1; i < plen; i++)  //模式串求 next[]
11     {
12         int j = Nextnum[i]; //返回上一次匹配结束时 j 指针的位置
13         while(j && p[i] != p[j]) j = Nextnum[j];  //匹配失效,模式串右移 j - next[j]位
14         Nextnum[i+1] = (p[i] == p[j]) ? j+1 : 0;  //前后缀匹配成功 next[i+1] = ++j; 否则 next[i+1] = 0;
15     }
16 }
17 void Kmp(char s[],char p[])
18 {
19     int last = -1;  //记录位置用
20     int slen = strlen(s), plen = strlen(p);
21     GetFail(p,plen);  //求next[]
22     for(int j = 0, i = 0; i < slen; i++)
23     {
24         while(j && s[i] != p[j]) j = Nextnum[j];  //匹配失效,模式串右移 j - next[j] 位
25         if(s[i] == p[j]) j++;  //匹配成功,继续匹配
26         if(j == plen)  //完全匹配
27         {   //匹配后的题目逻辑
28             printf("%d ", i+1-plen);  //输出在主串的起始位置
29         }
30     }
31 }
32 int main()
33 {
34     cin>>n>>p>>m>>s;
35     Kmp(s,p);
36     return 0;
37 }

 

KMP

原文:https://www.cnblogs.com/Edviv/p/11708519.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!