首页 > 编程语言 > 详细

KMP算法模板

时间:2018-10-02 21:08:34      阅读:177      评论:0      收藏:0      [点我收藏+]

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算法模板

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

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