首页 > 代码库 > KMP算法---字符串匹配

KMP算法---字符串匹配

算法细节详见点击打开链接点击打开链接

#include <stdio.h>#include <stdlib.h>#define N 7#define M 15void showpset(int* a);void cal_pset(char* a, int* p,int n);int KMP(char* a,char* b,int* P);int main(void){	char a[M]={‘a‘,‘b‘,‘a‘,‘c‘,‘a‘,‘b‘,‘a‘,‘a‘,‘b‘,‘a‘,‘b‘,‘a‘,‘c‘,‘b‘,‘d‘};	char b[N]={‘a‘,‘b‘,‘a‘,‘b‘,‘a‘,‘c‘,‘b‘};	int P[N]={0};	int i=1;	int index=-1;	cal_pset(b,P,N);	index=KMP(a,b,P);	//showpset(P);	printf("%d ",index);	system("pause");	return 0;}int KMP(char* a,char* b,int* P){	int i=0,j=0;	int flag=0;		while(i<M)	{		while(a[i]==b[j])		{			if(j==N-1)			{				flag=1;				break;				}			if(i<M-1 && j<N-1)			{				i++;				j++;			}			else			{				flag=2;				break;			}		}		if(a[i]!=b[j])		{			if(j==0 || (j!=0 && P[j-1]==0))			{				while(i<M && a[i]!=b[0])				{					i++;				}				j=0;			}			else			{				j=P[j-1];			}		}		if(flag==1)		{			return i-j;		}		if(flag==2)		{			return -1;		}	}	return -1;}void cal_pset(char* a, int* p,int n){	int i=1;	while(i<n)						//生成P矩阵	{		int j=0;		while(a[j]==a[i])		{			p[i]=p[i-1]+1;			j++;			i++;		}		p[i++]=0;	}}void showpset(int* a){	for(int i=0;i<N;i++)	{		printf("%d ",a[i]);	}	return ;}


 

KMP算法---字符串匹配