字符串匹配的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函数精确验证其正确性。
相关文章推荐
- KMP字符串匹配算法及C语言实现
- kmp算法字符串匹配C语言实现
- 字符串匹配KMP算法的C语言实现
- 常见的字符串匹配算法对比实现C语言版本
- [算法]字符串匹配算法之BM算法,C语言实现
- 【C语言】朴素字符串匹配算法及其实现
- 字符串匹配--Sunday算法-C语言实现
- C语言实现字符串匹配KMP算法
- C语言实现字符串匹配KMP算法
- C语言实现的带通配符的字符串匹配
- 回溯字符串【C语言】朴素字符串匹配算法及其实现
- CSP考试 2014年09月第3题 字符串匹配 C语言实现
- BM(Boyer-Moore)字符串匹配算法的实现(一种有效常用的字符串匹配算法)
- C语言实现:替换字符串中指定字符
- C语言实现全排列(部分算法参考网友,可实现重复字符的组合)
- 字符串匹配之KMP算法思路、原理与Java实现
- C语言实现对输入中的行数,单词个数,字符的个数进行计数
- KMP字符串匹配C++代码实现
- kmp算法实现的字符串匹配
- 字符串匹配算法(KMP算法c语言实现)