尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RabinKarp字符串匹配算法
该算法计算把每个字符映射至0到d-1之间的整数,从而把字符串看做d进制数,每一个字符串对应的d进制数就是字符串的指纹,两个字符串相等当且仅当它们的指纹相等.这样当把模式串和目标串对应子串匹配时只需比较它们的指纹是否相等就可判断是匹配成功还是失配。算法先用霍纳法则和模运算计算模式串和起始目标子串的指纹的模,每次匹配结束后,利用递推关系在常数时间内计算下一个目标子串的指纹的模,每次匹配时,若指纹的模不等则指纹不等从而可断定失配,若相等,则仍有可能失配此时直接比较模式串和目标子串判断是否匹配然后计算下一个目标子串指纹的模开始下一轮匹配。在算法运行前需预计算d的m-1次方的模,m是模式串的长度,可用反复平方法快速计算,计算结果在递推计算目标子串指纹的模时会用到.注意,每次得到目标子串指纹的模时,该要么是非负值mod,要么是mod减去q,(q是选定的素数模数),它们都是指纹除以模数的余数.由于模式串的指纹的模为正值,所以当目标子串的指纹的模为负时需要将其加上q得到非负余数才能和模式串指纹的模比较c代码:#includeiostream#includestring#includevectorusingstd::vector;usingstd::size_t;usingstd::string;size_tlog2(constsize_tN){size_t l0;size_t r1;while(true){r1;if(rN)break;l;}returnl;}longlongrepeatSquare(longlongbase,size_t exp,longlongmode){size_t bit_numlog2(exp);size_t mask1ullbit_num;size_t c0;longlongd1;while(mask!0){c1;d(d*d)%mode;size_t every_bitexpmask;if(every_bit){c;d(d*base)%mode;}mask1;}returnd;}voiddoRabinKarp(conststringpattern,conststringtext,constvectorlonglongmode_num){if(pattern.empty()||text.size()pattern.size())return;constlonglongradix128ll;vectorlonglongexp_mode_result(mode_num.size());for(size_t i0;imode_num.size();i){exp_mode_result[i]repeatSquare(radix,pattern.size()-1,mode_num[i]);}vectorlonglongpattern_mode_digit(mode_num.size());vectorlonglongtext_mode_digit(mode_num.size());for(size_t j0;jmode_num.size();j){for(size_t i0;ipattern.size();i){pattern_mode_digit[j](radix*pattern_mode_digit[j]static_castlonglong(pattern[i]))%mode_num[j];text_mode_digit[j](radix*text_mode_digit[j]static_castlonglong(text[i]))%mode_num[j];}}std::coutRabinKarp算法匹配结果:std::endl;for(size_t i0;itext.size()-pattern.size();i){if(pattern_mode_digittext_mode_digit){if(patterntext.substr(i,pattern.size())){std::cout匹配位置:istd::endl;}}if(i!text.size()-pattern.size()){for(size_t j0;jmode_num.size();j){longlongtemp(radix*(text_mode_digit[j]-static_castlonglong(text[i])*exp_mode_result[j])static_castlonglong(text[ipattern.size()]))%mode_num[j];text_mode_digit[j]temp0?tempmode_num[j]:temp;}}}}intmain(){string textababababab;string pabab;vectorlonglongq{999983,100003};doRabinKarp(p,text,q);return0;}
RELATED

相关推荐

Tabler Icons完整入门:如何快速用免费6100+ SVG图标库搭起一套视觉统一界面

Tabler Icons完整入门:如何快速用免费6100+ SVG图标库搭起一套视觉统一界面

Tabler Icons完整入门:如何快速用免费6100 SVG图标库搭起一套视觉统一界面 【免费下载链接】tabler-icons A set of over 6100 free MIT-licensed high-quality SVG icons for you to use in your web projects. 项目地址: https://gitcode.com/GitHub_Trending/t…

📅 2026/11/9 1:34:24
7 天掉签的 IPA 怎么永久装进 iOS?TrollStore 免签名安装指南

7 天掉签的 IPA 怎么永久装进 iOS?TrollStore 免签名安装指南

7 天掉签的 IPA 怎么永久装进 iOS?TrollStore 免签名安装指南 【免费下载链接】TrollStore Jailed iOS app that can install IPAs permanently with arbitary entitlements and root helpers because it trolls Apple 项目地址: https://gitcode.com/GitHub_Tren…

📅 2026/9/26 22:48:07
ExplorerPatcher 崩溃快速排查与修复指南

ExplorerPatcher 崩溃快速排查与修复指南

ExplorerPatcher 崩溃快速排查与修复指南 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher 把任务栏、开始菜单变回 Windows 10…

📅 2026/9/13 3:59:59
MORE NEWS

更多资讯

📰

老板要我电工证怎么考?电子证书怎么拿?新手全攻略

老板要我电工证怎么考?电子证书怎么拿?新手全攻略 你是不是正在找工作,老板一句话就卡住了:“你得先去考个电工证!”没错,特种作业证已经成为很多岗位的门槛,尤其是电工证,几乎成了电力、建筑、制造业等行业招聘的硬性要求。现在,电子证书已经全面推…

📰

颍上县电工证办理网上查询怎么操作?学历不高也能报名!

颍上县电工证办理网上查询怎么操作?学历不高也能报名! 你是不是也担心 学历不高怕报不上名 ?其实,在 颍上县电工证办理 这件事上,学历并不是唯一的门槛。很多人以为只有大学生才能考电工证,但事实上,只要符合国家规定的身体条件和年龄要求,…

📰

吉首考电工证培训几天 良心建议别再拖着不复审

吉首考电工证培训几天 良心建议别再拖着不复审 证书过期了不知道怎么复审延期?你不是一个人。很多人以为电工证过期了还能继续干,结果一查就凉了。别再等了, 吉首考电工证培训几天 这个问题,其实早该安排上。…

📰

电工证切断电源和官方回应,考不过白交钱?

电工证切断电源和官方回应,考不过白交钱? 怕考不过白交培训费?电工证切断电源这块儿的考试内容你真了解吗?现在不少人在考电工证时都怕遇到“断电操作”这类题,怕考不过白交钱,但官方回应其实早就说得很清楚了,别慌! 电工证切断电源到底考啥?…

📰

初级电工证怎么报名?实操考试心里没底怕挂科?考初级电工证技巧全在这

初级电工证怎么报名?实操考试心里没底怕挂科?考初级电工证技巧全在这 你不是一个人在担心实操考试挂科。很多河南公路工程从业者,尤其是刚入行的电工新手,面对初级电工证考试时都犯愁。 实操考试心里没底怕挂科…

📰

哪里有建筑电工证考?2026河南最新政策下怎么转异地

哪里有建筑电工证考?2026河南最新政策下怎么转异地 之前考的证在外省能不能转过来?这几乎是每个在外地打工的建筑电工最关心的问题。2026年河南最新政策已经明确,特种作业操作证在全国范围内实行“一证通考、异地通用”,但具体的转证流程和材料要…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬