C语言中实现KMP算法的实例讲解
一般的算法为什么这么低效呢?那是因为主串指针回溯情况过多: int Index(char s[],char p[],int pos) { int i,j,slen,plen; i = pos; j = 0; slen = strlen(s); plen = strlen(p); while((i < slen) && (j < plen)) { if((s[i] == p[j])) { i++; j++; } else { i = i-j+1; j = 0; } } if(j >= plen) { return (i-plen); } else { return -1; } } 具体请看如下程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 101 void get_next( int *next,char *a,int la) /*求NEXT[]的值*/ { int i=1,j=0 ; next[1] = 0 ; while ( i <= la) /*核心部分*/ { if( a[i] == a[j] || j == 0 ) { j ++ ; i ++ ; if( a[i] == a[j]) next[i] = next[j]; else next[i] = j ; } else j = next[j] ; } } int str_kmp( int *next,char *A,int lA,int la)/* EASY*/ { int i,k ; i = 1 ; j = 1 ; while ( i<=lA && j <= la ) { if(A[i] == a[j] || j == 0 ) { i ++ ; j ++ ; } else j = next[j] ; } if ( j> la) return i-j+1 ; else return -1 ; } int main(void) { int n,k; int next[MAX]={0} ; int lA=0,la =0 ; char A[MAX],a[MAX] ; scanf("%s %s",A,a) ; lA = strlen(A); la = strlen(a); for(k=la-1; k>= 0 ;k --) a[k+1] = a[k] ; for(k=lA-1; k>= 0 ;k --) A[k+1] = A[k] ; get_next(next,a,la) ; k = str_kmp(next,lA,la); if ( -1 == k) printf("Not Soulation!!! "); else printf("%d ",k) ; system("pause"); return 0 ; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |