zoukankan      html  css  js  c++  java
  • 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 ;
    }


     

  • 相关阅读:
    ProjectEuler 13
    ProjectEuler 8
    ProjectEuler 5
    ProjectEuler 6
    ProjectEuler 7
    ProjectEuler 9
    日程管理系统维护改善1
    日程管理系统改错
    android作业Text
    四则运算
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4029732.html
Copyright © 2011-2022 走看看