void callTextSearch(uchar text[], uchar pattern[]) { int position , patn_len ; patn_len = strlen((char*)pattern); /* パターンの長さをセット */ #if BF printf("--- B F ---\n"); printf("%s\n",text); position = brute_force_search(text, pattern); printf("position=%d\n",position); #endif #if KMP printf("--- KMP ---\n"); init_next(pattern); printNext(pattern, patn_len); printf("%s\n",text); position = kmp_search(text, pattern); printf("position=%d\n",position); #endif #if BM printf("--- B M ---\n"); init_skip(pattern); printSkip(pattern, patn_len); printf("%s\n",text); position = bm_search(text, pattern); printf("position=%d\n",position); #endif }
void extend_kmp()//char const* str) { str_len = strlen(str); init_next(); int index = 0; int min_len = ( str_len < sub_len ? str_len : sub_len); for( ;sub_str[index] == str[index] && index <min_len ; index++) {} extend[0] = index; int mate_len=0, pos = 0; for( index = 1 ; index < str_len ; index++){ //pos 匹配到最远是的位置,index为当前点 if(next[index - pos] + index < extend[pos] + pos){ // index-1+next[index-pos] < pos+extend[pos]-1 extend[index] = next[index - pos]; // extend[pos] + pos 为之前匹配到的最远位置 } else{ mate_len = extend[pos] + pos - index; // 已经匹配的长度 if( mate_len < 0) mate_len = 0; for( ; index + mate_len < str_len && mate_len < sub_len && sub_str[mate_len] == str[mate_len + index] ; mate_len++ ) {} extend[index] = mate_len ;//++mate_len; pos = index; } } }