KMP算法入门【详解+例题模板】
来源:互联网 发布:网络延长器是一对吗 编辑:程序博客网 时间:2024/06/03 05:12
转载请注明出处:http://blog.csdn.net/a1dark
KMP算法的来由就不说了、就个人的理解其实就是预处理要匹配的那个字符串、根据自己身的重复性来找规律节约遍历的时间、说术语就是寻找字符串前缀和后缀相同的最长的长度、当然本身除外、举个例就是“acbacd”、比如这个字符串匹配到最后一个字符错了、于是我看它前面的几个字符特点很明显我们不用重新从头开始比、而可以从字符“b”开始比、因为“acbac”的前缀“ac”==后缀“ac”、相当于间接的比过了、我觉得这个比较好理解吧、虽然这个思想确实比较容易理解、但是想要轻松自己把这个求模式函数next值想出来可不容易、思想理解了、实现就看个人了。。。
下面上几道例题、增强一下、
首先一道赤裸裸的KMP
以前写过:【HDU 1711】
http://blog.csdn.net/a1dark/article/details/12247471
接下来关于next值的一些小应用:
【POJ 2406】
#include<stdio.h>#include<string.h>char str[1000001];int next[1000001];int getnext(){ int j=0,k=-1; next[0]=-1; int len=strlen(str); while(j<len){ if(k==-1||str[j]==str[k]){ j++; k++; next[j]=k; } else k=next[k]; } int s=len-k; if(len%s==0){ return len/s; } return 1;}int main(){ while(gets(str)){ if(str[0]=='.')break; printf("%d\n",getnext()); } return 0;}
【POJ 1961】
#include<stdio.h>#include<string.h>int next[1000001];char str[1000001];int n;void getnext(){ int j=0,k=-1; next[0]=-1; while(j<n){ if(k==-1||str[j]==str[k]){ j++; k++; next[j]=k; } else k=next[k]; }}int main(){ int cas=1; while(scanf("%d",&n)!=EOF){ if(n==0)break; scanf("%s",str); getnext(); printf("Test case #%d\n",cas++); for(int i=1;i<=n;i++){ int len=i-next[i]; if(next[i]>0&&i%len==0){ printf("%d %d\n",i,i/len); } } printf("\n"); } return 0;}
- KMP算法入门【详解+例题模板】
- KMP算法详解与例题汇总
- KMP算法入门详解
- KMP模板+例题
- KMP算法详解与模板
- 【KMP】KMP算法模板
- kmp算法 和例题 poj1961
- KMP算法详解 【KMP】
- kmp算法模板
- kmp算法模板
- KMP算法模板
- KMP算法模板
- KMP算法(模板)
- KMP算法模板
- KMP算法标准模板
- KMP算法模板
- KMP算法模板
- KMP算法模板
- 10151
- SQL Server 触发器中 Update的方法 判断一列是否更新 <转>
- 多线程的小知识点
- IOCP编程注意事项
- 常见http错误代码提示
- KMP算法入门【详解+例题模板】
- POJ挑战赛3(POJ Challenge Round 3)题解
- 如何学习opensips/kamailio/openser
- AsyncTask实现代码原理
- 11.13数据结构----树与森林
- java学习笔记1-关于throw和throws的一点总结
- 大公司面试题之二叉查找树转双向链表
- UVa 442 Matrix Chain Multiplication
- 经典SQL语句大全