在看了两三天的KMP,我觉得主要的难点在于,不理解next是什么东西,有什么用。
说的明白点就是next【i】就表示从i这个点之前有几个点和从第一个点开始的字符是一样的。
位置 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
next【i】-1 0 0 0 0 1 2 3 1 2 3 4 5 6 7 4
子串 a g c t a g c a g c t a g c t g
说的明白点就是next【i】就表示从i这个点之前有几个点和从第一个点开始的字符是一样的。
位置 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
next【i】-1 0 0 0 0 1 2 3 1 2 3 4 5 6 7 4
子串 a g c t a g c a g c t a g c t g
<span style="font-size:18px;">/
#include
#include
#include
#define MAXN 100
void Get_Next (char *T , int *next){
next[0] = -1 ;
int k = -1 , j = 0 ;
int len = strlen(T) ;
while(j < len- 1 ){
if(k == -1 || T[j] == T[k]) next[++j] = ++k ;
else k = next[k] ;
}
}
int KMP_Search(char *S , char *T){
int next[MAXN] ;
int i = 0 , j = 0 , len_T = strlen(T) , len_S = strlen(S) ;
Get_Next(T , next) ;
while(i//
i {
if( j == -1 || S[i] == T[j]) {j++ ; i++ ;}
else j = next[j] ;
if(j == len_T) return i - j ;
}
return -1 ;
}
int main(){
char S[MAXN] , T[MAXN] ;
int cot ;
while(scanf("%d", &cot )!=EOF){
scanf("%s%s", S ,T) ;
int pot = KMP_Search( S , T) ;
if(pot > 0 )
printf("找到T在S中的子串在第%d个位置\n" ,pot+1 ) ;
else printf("没有找到\n") ;
}
return 0 ;
}</span>