KMP算法之简单见解
来源:互联网 发布:淘宝收藏有礼怎么设置 编辑:程序博客网 时间:2024/05/21 10:20
kmp算法
假设有两个字符串,S和T, S[k+1],S[k+2].......S[k+p],与T[1],T[2]........T[p] 相等,S[k+p+1]与S[p+1]不等;这时候我们就会用的next数组,假
设next[p+1]=w; 也就是说我们可以直接用S[k+p+1]与T[w]相比较,前面都是相等的,这个w代表的是在T[1]....T[p]之间 , 前缀和后缀最长的匹配,
也就是(1)T[w-1] = T[p], T[w-2] = T[p-1]......T[1] = T[p-w+2]. 如果要证明在S[k+p+1]与T[p+1]不等后可以直接用 S[k+p+1]与T[w]直接相比较,那必
须证明T[w-1] = S[k+p], T[w-2] = S[k+p-1].....T[1] = S[k+p-w+2];我们知道根据S[k+p+1]与S[p+1]不等,前面都相等,
可得到(2)S[k+1] = T[1], S[k+2] = T[2]......S[k+p] = T[p];
由(1)得T[w-1] = T[p], 由(2)得 T[p] = S[k+p] 所以 T[w-1] = S[k+p],同理可计算其他的。这是我对这个算法的一些理解。
下面附上HDU1711题
#include<iostream>#include<string>using namespace std;int next[10005] , n, m, s1[1000005], s2[10005];void initnext(int s[]){ int i, j; j = -1; i = 0; while(i < m) { if(j == -1 || s[i] == s[j]) { i++; j++; next[i] = j; } else { j = next[j]; } }}int kmp(int a[], int b[]){ int i = 0 , j = 0; while(i < n && j < m) { if(j == -1 || a[i] == b[j]) { i++; j++; } else { j = next[j]; } } if(j >= m) return i-j+1; else return -1; }int main(){ int k, t, i, j; while(cin>>t) { for(i = 0; i < t; ++i) { cin>>n>>m; memset(next, 0 ,sizeof(next)); next[0] = -1; for(j = 0; j < n; ++j) { cin>>s1[j]; } for(j = 0; j < m; ++j) { cin>>s2[j]; } initnext(s2); k = kmp(s1, s2); cout<<k<<endl; } } return 0;}
这是自己写的第一篇技术博客,希望继续努力啊。
- KMP算法之简单见解
- KMP算法 --数据结构实验之串一:KMP简单应用
- 简单KMP算法
- KMP算法简单说明
- KMP算法简单分析
- 简单的KMP算法
- KMP算法简单实现
- 简单理解KMP算法
- 简单的KMP算法
- 算法之KMP算法
- 吾之简单的KMP算法学习,字符串操作基本功
- KMP算法之来龙去脉
- KMP算法之我见
- 算法入门之KMP
- 字符串 之 KMP算法
- KMP算法之我见
- KMP算法之我见
- KMP算法之二
- MySQL与Oracle的区别
- 6410 H.264远程视频监控 .
- 意见反馈 页面布局的设计
- Bayes classifier and LDA, PLSA
- Duilib文档
- KMP算法之简单见解
- java中size() 、length()和length的区别
- Java中对象存储位置
- mysql的参数设置
- 移植mjpg-streamer到6410开发板(通过Web远程浏览摄像头)
- 基于LabWindows/CVI的光谱分析系统的设计与实现
- 很重要!!!ssh集成的时候struts2 和 spring3集成一定要在struts.xml文件里配置!<constant name="struts.objectFactory" value="sp
- Hibernate : Query.list()、Query.iterator()的区别
- hdoj 1106