您的位置:首页 > 编程语言 > C语言/C++

字符串匹配的RabinKarp算法的c语言实现

2014-07-29 15:10 253 查看
</pre><pre name="code" class="cpp">#include<string.h>
int check( char *s1,char *s2,int n );
int main()
{
char s1[10000],s2[1000000];
int n,i,j,k;
int T = 563;
scanf( "%d",&n );
for( i = 0;i < n;++i )	{
int key1 = 0,key2 = 0,temp = 1;
int len1,len2;
int count = 0;
scanf( "%s %s",s1,s2 );
len1 = strlen(s1),len2 = strlen(s2);
if( len1 > len2 )	{
printf( "0\n" );
break;
}
for( j = 0;j < len1;++j )	{
key1 = ( key1 * 26 + s1[j] - 'A' ) % T;
key2 = ( key2 * 26 + s2[j] - 'A' ) % T;
}
for( j = 0;j < len1 - 1;++j )
temp = (temp % T * 26 % T) % T;   // printf( "%d\n",temp );
// printf( "key1: %d  key2 : %d\n",key1,key2 );
if( key1 == key2 && check(s1,s2,len1) )
++count;
for( j = 1;j <= len2 - len1;++j )	{
int t = key2 - (s2[j-1] - 'A') * temp;
if( t < 0 )
while( t < 0 )
t += T;
key2 = ( t * 26 + s2[j+len1-1] - 'A' ) % T;
// printf( "ignore: %c,add %c ",s2[j-1],s2[j+len1-1] );
// printf( "key2 : %d\n",key2 );
if( key2 != key1 )
continue;
else {
if( check( s1,s2 + j,len1 ) )
++count;
}
}
printf( "%d\n",count );
}
return 0;
}
int check( char *a,char *b,int n )
{
int i = 0;
for( i = 0;i < n;++i )
if( a[i] != b[i] )
return 0;
return 1;
}

字符串匹配的RabinKarp算法就是将模式转化为数字形式,然后在母版上寻找其数值与模式数值相同的片段,如果模式长度较长,则选用取模后所得数相同的值在进行精确验证其是否相等。如果在文本搜索中能够匹配的次数很少,则其事件复杂度可以看做是O(n+m);下面程序是将字符集a-z看做是26位进制的数值,然后对其进行求模寻找相等值,如果有在使用check函数精确验证其正确性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: