int match ( char* P, char* T ) { //KMP算法 int* next = buildNext ( P ); //构造next表 int n = ( int ) strlen ( T ), i = 0; //文本串指针 int m = ( int ) strlen ( P ), j = 0; //模式串指针 while ( j < m && i < n ) //自左向右逐个比对字符 /*DSA*/{ /*DSA*/showProgress ( T, P, i - j, j ); /*DSA*/printNext ( next, i - j, strlen ( P ) ); /*DSA*/getchar(); printf ( "\n" ); if ( 0 > j || T[i] == P[j] ) //若匹配,或P已移出最左侧(两个判断的次序不可交换) { i ++; j ++; } //则转到下一字符 else //否则 j = next[j]; //模式串右移(注意:文本串不用回退) /*DSA*/} delete [] next; //释放next表 return i - j; }
int match(char * text, char * pattern){ int * next = buildNext(pattern); int text_len = (int)strlen(text), text_i = 0; int pattern_len = (int)strlen(pattern), pattern_i = 0; std::cout<<"text:"<<text<<std::endl; std::cout<<"text len:"<<text_len<<std::endl; std::cout<<"pattern:"<<pattern<<std::endl; std::cout<<"pattern len:"<<pattern_len<<std::endl; while( pattern_i < pattern_len && text_i < text_len ){ if( pattern_i < 0 || text[text_i] == pattern[pattern_i] ){ //pattern_i<0 means get next[0] == -1 text_i++; pattern_i++; } else { //pattern move right, text no backout pattern_i = next[pattern_i]; } } delete [] next; return text_i - pattern_i; }