您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: