C字符串匹配KMP算法
2014-03-22 00:00
155 查看
摘要: C字符串匹配KMP算法
/* * author : wxg */ #include<stdio.h> #include<string.h> #include<stdlib.h> void getNext(const char ch[],int next[]) { int k=-1,j=0; // k=next[j] 第j个位置匹配失败,则退回到位置 k 开始匹配 ,也表示:k 为ch[j]的前缀函数值 next[0]=-1; // 第 0个位置的字符的(前缀=后缀)的值为 -1; int n = strlen(ch); while(j<n){ if((k==-1)||(ch[j]==ch[k])){ // k=-1:该位置的字符没有前缀=后缀的值,那么让它的值为第一个元素的位置,因为我们从头开始匹配 j++; k++; next[j]=k; // 这行代码放在 j++ k++后面, } else{ // int m=next[j]; // printf("m=%d k=%d \n",m,k); // k=next[next[j]]; //不要写成这样,因为 由于j是固定不变的,那么 next[next[j]] 也是固定不变的,没有向前递归 k=next[k]; // 如果ch[j]!=ch[k],那么找第二大前缀; 有慢慢向前递归!!! } } } int main(){ int i=0,j=0,loc=-1; //位置从0开始计数 const char T[]="abcac"; const char S[]="ababcabcacbab"; int len_t=strlen(T); int len_s=strlen(S); int *next = (int *)malloc(len_t*sizeof(int)); getNext(T,next); // for(i=0;i<len_t;i++){ // printf("next=%d ",next[i]); // } // printf("\n"); // // next[0]=-1;next[1]=0;next[2]=0;next[3]=0;next[4]=1; for(i=0,j=0;i<len_s&&j<len_t;){ if(T[j]==S[i]){ i++;j++; if(j==len_t){ loc=i-j;break; } } else if(i>=len_s){ loc=-1; break; } else{ j=next[j]; if(j==-1){ i++;j++; } } } printf("loc= %d \n",loc); return 0; }
相关文章推荐
- 字符串匹配的KMP算法
- 字符串匹配KMP算法
- 字符串匹配的KMP算法
- 【详细解析】字符串匹配的KMP算法
- 字符串匹配的KMP算法(简单清晰的认识KMP)
- 字符串匹配的KMP算法
- 字符串匹配的KMP算法
- 字符串匹配的KMP算法
- 字符串匹配算法——KMP算法
- 字符串匹配算法---KMP算法
- kmp算法(字符串匹配 next应用 hdu题目集合)
- 字符串匹配的KMP算法(说得最清楚的一篇)
- 字符串匹配的KMP算法
- 字符串匹配的KMP算法
- 字符串匹配 之 KMP算法
- 字符串匹配算法之KMP算法
- 字符串匹配之KMP算法
- 浅谈字符串匹配算法—BF算法及KMP算法
- 字符串匹配的KMP算法
- 【字符串匹配】KMP算法之道