KMP算法---字符串匹配

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

#include <stdio.h>

#include <stdlib.h>

#define N 7

#define M 15

void 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 ;

}


 

你可能感兴趣的:(字符串)