Пример #1
0
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;
}
Пример #2
0
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;
}