/* 算法导论上的代码字符串是从1开始的,而这个是从0开始的比较符合编程习惯 另一个区别是这里的前缀函数pi[i]表示的是p[0..i]与p[m-i..m]匹配,与算法 导论上表示的长度不同。不过这只是细节上的大同小异。 */ char str[size+10]; int pi[size+10]; void calpi(char p[],int len) { pi[0]=-1; int k=-1; for (int i=1;i
=0 && p[k+1]!=p[i]) k=pi[k]; if (p[k+1]==p[i]) ++k; pi[i]=k; } } void kmp(char T[],int n,char p[],int m) //n,m为主串和子串的长度 { calpi(p,m); int k=-1; for (int i=0;i
=0 && p[k+1]!=T[i]) k=pi[k]; if (p[k+1]==T[i]) ++k; if (k==m-1) { printf("Pattern occurs with at %d",i-m+1); k=pi[k]; } } }
kmp模板
最新推荐文章于 2019-09-17 23:11:11 发布