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

KMP算法模板

时间:2018-10-02 22:27:54      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:res   href   problem   ||   i++   sizeof   amp   get   col   

sub[ ]代表子串,str[ ]代表原串,next[ ]代表当sub[i] != str[j]时,子串需要跳到的地方,实现代码如下:

获取next数组的代码:

 1 void GetNext()//求子串中的相同的真前缀和真后缀
 2 {
 3     memset(next, 0, sizeof(next));
 4     next[0] = -1;
 5     int i = 0,j = -1;
 6     int sub_len = strlen(sub);
 7     while(i < sub_len)
 8     {
 9         if(j == -1 || sub[i] == sub[j])
10         {
11             i++;
12             j++;
13             next[i] = j;
14         }
15         else
16             j = next[j];
17     }
18 }

KMP实现的代码:

 1 int KMP()
 2 {
 3     int res = 0;
 4     int sub_len = strlen(sub);
 5     int str_len = strlen(str);
 6     int i = 0;
 7     int j = 0;
 8     while(i < str_len && j < sub_len)
 9     {
10         if(j == -1 || str[i] == sub[j])
11         {
12             i++;
13             j++;
14         }
15         else
16             j = next[j];
17         if(j == sub_len)     //此处实现的是统计子串在原串中出现的次数
18         {                    //这里可以根据具体情况来调整
19             res++;
20             j = next[j];
21         }
22     }
23     return res;
24 }

练习题:Oulipo-Poj

 

KMP算法模板

标签:res   href   problem   ||   i++   sizeof   amp   get   col   

原文地址:https://www.cnblogs.com/sykline/p/9737835.html

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