KMP样例程序

来源:互联网 发布:知世头像 编辑:程序博客网 时间:2024/05/22 07:46
#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 100void cal_next( char * str, int * next, int len ){int i, j;next[0] = -1;for( i = 1; i < len; i++ ){j = next[ i - 1 ];while( str[ j + 1 ] != str[ i ] && ( j >= 0 ) ) //12131212---12131211j = next[ j ];if( str[ i ] == str[ j + 1 ] )next[ i ] = j + 1;elsenext[ i ] = -1;}}int KMP( char * str, int slen, char * ptr, int plen, int * next ){int s_i = 0, p_i = 0;while( s_i < slen && p_i < plen ){if( str[ s_i ] == ptr[ p_i ] ){s_i++;p_i++;}else{if( p_i == 0 )s_i++;elsep_i = next[ p_i - 1 ] + 1;}}return ( p_i == plen ) ? ( s_i - plen ) : -1;}int main(){char str[ N ] = {0};char ptr[ N ] = {0};int slen, plen;int next[ N ];while( scanf( "%s%s", str, ptr ) ){slen = strlen( str );plen = strlen( ptr );cal_next( ptr, next, plen );printf( "%d\n", KMP( str, slen, ptr, plen, next ) );}return 0;}

原创粉丝点击