字符串匹配的RabinKarp算法的c语言实现
来源:互联网 发布:外文数据库有哪些 编辑:程序博客网 时间:2024/05/21 18:50
</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函数精确验证其正确性。
0 0
- 字符串匹配的RabinKarp算法的c语言实现
- 字符串匹配——RabinKarp算法
- 字符串匹配算法的C/C++语言实现
- 字符串匹配算法的C/C++语言实现(一)
- 常见的字符串匹配算法对比实现C语言版本
- c语言:字符串匹配的KMP算法
- C语言实现串的匹配算法
- KMP字符串匹配算法C语言实现
- 字符串匹配--Sunday算法-C语言实现
- kmp算法字符串匹配C语言实现
- C语言实现字符串匹配KMP算法
- [算法]字符串匹配算法之BM算法,C语言实现
- C语言实现的带通配符的字符串匹配
- 字符串匹配算法的实现
- 字符串匹配算法(KMP算法c语言实现)
- KMP算法实现字符串的模式匹配完整C代码
- rock c语言实现的带通配符匹配算法
- 字符串匹配问题 kmp算法C语言实现
- SSH 和SSL 比较
- C++中类似Lua表格式的数据类型
- 我的算法学习之路
- AJAX基础学习4之JSON
- 可可风格离我饿
- 字符串匹配的RabinKarp算法的c语言实现
- python中下划线的用法(单下划线和双下划线)
- python入门学习
- VLC-DSS搭建直播系统中链路断开影响测试
- 梦落的~
- hdoj.2013 蟠桃记 20140723
- hdu 1851 A Simple Game
- Weblogic之weblogic数据源配置及jndi调用
- php下载远程文件代码(curl ,支持重定向)