kmf算法

时间:2025-02-15 17:54:57
  • #include <>
  • #include <>
  • char P[100],T[100];
  • void get_next( char P[],int next[]){
  • int q,k,m;
  • m=strlen(P);
  • next[0]=0;
  • for(q=1,k=0;q<m;q++){
  • while(k>0 && P[k]!=P[q]){
  • k=next[k-1];
  • }
  • if(P[k]==P[q]){
  • k++;
  • }
  • next[q]=k;
  • }
  • }
  • int kmp( char T[], char P[],int text[]){
  • int n,m,q,i;
  • n=strlen(T);
  • m=strlen(P);
  • get_next( P, text);
  • for(i=0,q=0;i<n;i++){
  • while(q>0 && T[i]!=P[q]){
  • q=text[q-1];
  • }
  • if(P[q]==T[i]){
  • q++;
  • }
  • if(q==m){
  • printf("%d\n",(i-m+2));
  • break;
  • }
  • if(i==(n-1) && q!=m){
  • printf("0\n");
  • }
  • }
  • }
  • int main(){
  • int i;
  • for(i=0;i<3;i++){
  • int text[255]={0};
  • scanf("%s %s",T,P);
  • kmp(T,P,text);
  • }
  • return 0;
  • }