KMP 小总结

来源:互联网 发布:青岛十五中行知楼 编辑:程序博客网 时间:2024/06/04 19:54

以下是我目前做题遇到的知识点:(如有不足请指出,后续会更新)


nex数组代码:

void get_next(){int j=-1,i=0;int m=strlen(b);nex[0]=-1;while(i<m){if(j==-1 || b[i]==b[j])nex[++i]=++j;else j=nex[j];}}


KMP算法代码:

int KMP(char a[],char b[]){//j是子串下标 get_next(a,b);int i=0;int j=0;int n=strlen(a);int m=strlen(b);while(i<n){if(j==-1 || a[i]==b[j]){i++;j++;}else j=nex[j];}}


实用知识点:

KMP算法是关于匹配字符串的算法

 

循环节长度:

len-nex[len]

 

对于不全循环节至少需要几个字符:

int n = strlen(b);

int len= n - nex[n];  //循环节长度

int num=n/len;  //循环节个数

int k =len - (n - num*len);

if(k == len && num > 1) k = 0;

 

求循环次数:

get_nxet()数组中加入 j==m 的判断条件

若求不重复的循环次数从总数加一后 j0开始(初始值)

求重叠式的为 j=nex[j]

 

关于 nex[]数组的值:

nex[len]表示第len位之前的字符串中 前nex[len]位 和 后nex[len]相等

adbdad nex[6]=2;

 

原创粉丝点击