主要实现KMP算法
#include "SString2.h"
#include "include.h"
int strlength ( char s[ ] ) {
int i= 0 ;
while ( s[ i] != '\0' )
{
i++ ;
return i;
}
}
int strcompare ( char s[ ] , char t[ ] ) {
int i= 0 ;
while ( s[ i] != '\0' && t[ i] != '\0' )
if ( s[ i] == t[ i] ) i++ ;
else return s[ i] - t[ i] ;
return s[ i] - t[ i] ;
}
Status Concat ( SString & T, SString S1, SString S2) {
Status uncut;
if ( S1[ 0 ] + S2[ 0 ] <= MAXSTRLEN) {
for ( int i= 1 ; i< S1[ 0 ] ; i++ ) {
T[ i] = S1[ i] ;
}
for ( int i= 1 , j= S1[ 0 ] ; i< S2[ 0 ] , j< S1[ 0 ] + S2[ 0 ] ; i++ , j++ ) {
T[ j] = S2[ i] ;
}
T[ 0 ] = S1[ 0 ] + S2[ 0 ] ;
uncut= TRUE;
}
else if ( S1[ 0 ] < MAXSTRLEN) {
for ( int i= 1 ; i< S1[ 0 ] ; i++ ) {
T[ i] = S1[ i] ;
}
for ( int i= 1 , j= MAXSTRLEN; i< MAXSTRLEN- S1[ 0 ] ; i++ )
T[ j] = S2[ i] ;
T[ 0 ] = MAXSTRLEN;
uncut= FALSE;
}
else {
for ( int i= 0 ; i< MAXSTRLEN; i++ ) {
T[ i] = S1[ i] ;
}
uncut= FALSE;
}
return OK;
}
Status SubString ( SString & Sub, SString S, int pos, int len) {
if ( pos< 1 || pos> S[ 0 ] || len< 0 || len> S[ 0 ] - pos+ 1 )
return ERROR;
for ( int i= 1 , j= pos; i<= len, j<= pos+ len+ 1 ; i++ , j++ )
Sub[ i] = S[ j] ;
Sub[ 0 ] = len;
return OK;
}
int Index ( SString S, SString T, int pos) {
int i= pos;
int j= 1 ;
while ( i<= S[ 0 ] && j<= T[ 0 ] )
if ( S[ i] == T[ j] ) {
++ i; ++ j;
}
else { i = i - j+ 2 ; j= 1 ; }
if ( j> T[ 0 ] )
return i - T[ 0 ] ;
else
return 0 ;
}
void get_next ( SString T, int next[ ] ) {
int i= 1 , j= 1 ;
next[ 1 ] = 0 ;
while ( i < T[ 0 ] ) {
if ( j == 0 || T[ i] == T[ j] ) {
++ i; ++ j; next[ i] = j;
}
else j = next[ j] ;
}
}
void get_nextval ( SString T, int nextval[ ] ) {
int i= 1 , j= 0 ;
nextval[ 1 ] = 0 ;
while ( i < T[ 0 ] ) {
if ( j == 0 || T[ i] == T[ j] ) {
++ i; ++ j;
if ( T[ i] != T[ j] )
nextval[ i] = j;
else
nextval[ i] = nextval[ j] ;
}
else j= nextval[ j] ;
}
}
int Index_KMP ( SString S, SString T, int pos) {
int i = pos, j= 1 ;
int next[ 20 ] ;
get_next ( T, next) ;
while ( i <= S[ 0 ] && j <= T[ 0 ] ) {
if ( j== 0 || S[ i] == T[ j] ) {
++ i; ++ j;
}
else
j = next[ j] ;
}
if ( j > T[ 0 ] )
return i- T[ 0 ] ;
else
return 0 ;
}