news 2026/9/6 22:51:29

RabinKarp字符串匹配算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RabinKarp字符串匹配算法

该算法计算把每个字符映射至0到d-1之间的整数,从而把字符串看做d进制数,每一个字符串对应的d进制数就是字符串的指纹,两个字符串相等当且仅当它们的指纹相等.这样当把模式串和目标串对应子串匹配时,只需比较它们的指纹是否相等就可判断是匹配成功还是失配。
算法先用霍纳法则和模运算计算模式串和起始目标子串的指纹的模,每次匹配结束后,利用递推关系在常数时间内计算下一个目标子串的指纹的模,每次匹配时,若指纹的模不等,则指纹不等,从而可断定失配,若相等,则仍有可能失配,此时直接比较模式串和目标子串判断是否匹配,然后计算下一个目标子串指纹的模,开始下一轮匹配。在算法运行前需预计算d的m-1次方的模,m是模式串的长度,可用反复平方法快速计算,计算结果在递推计算目标子串指纹的模时会用到.
注意,每次得到目标子串指纹的模时,该要么是非负值mod,要么是mod减去q,(q是选定的素数模数),它们都是指纹除以模数的余数.由于模式串的指纹的模为正值,所以当目标子串的指纹的模为负时,需要将其加上q得到非负余数才能和模式串指纹的模比较

c++代码:

#include<iostream>#include<string>#include<vector>usingstd::vector;usingstd::size_t;usingstd::string;size_tlog2(constsize_t&N){size_t l=0;size_t r=1;while(true){r<<=1;if(r>N)break;++l;}returnl;}longlongrepeatSquare(longlongbase,size_t exp,longlongmode){size_t bit_num=log2(exp);size_t mask=1ull<<bit_num;size_t c=0;longlongd=1;while(mask!=0){c<<=1;d=(d*d)%mode;size_t every_bit=exp&mask;if(every_bit){++c;d=(d*base)%mode;}mask>>=1;}returnd;}voiddoRabinKarp(conststring&pattern,conststring&text,constvector<longlong>&mode_num){if(pattern.empty()||text.size()<pattern.size())return;constlonglongradix=128ll;vector<longlong>exp_mode_result(mode_num.size());for(size_t i=0;i<mode_num.size();++i){exp_mode_result[i]=repeatSquare(radix,pattern.size()-1,mode_num[i]);}vector<longlong>pattern_mode_digit(mode_num.size());vector<longlong>text_mode_digit(mode_num.size());for(size_t j=0;j<mode_num.size();++j){for(size_t i=0;i<pattern.size();++i){pattern_mode_digit[j]=(radix*pattern_mode_digit[j]+static_cast<longlong>(pattern[i]))%mode_num[j];text_mode_digit[j]=(radix*text_mode_digit[j]+static_cast<longlong>(text[i]))%mode_num[j];}}std::cout<<"RabinKarp算法匹配结果:"<<std::endl;for(size_t i=0;i<=text.size()-pattern.size();++i){if(pattern_mode_digit==text_mode_digit){if(pattern==text.substr(i,pattern.size())){std::cout<<"匹配位置:"<<i<<std::endl;}}if(i!=text.size()-pattern.size()){for(size_t j=0;j<mode_num.size();++j){longlongtemp=(radix*(text_mode_digit[j]-static_cast<longlong>(text[i])*exp_mode_result[j])+static_cast<longlong>(text[i+pattern.size()]))%mode_num[j];text_mode_digit[j]=temp<0?temp+mode_num[j]:temp;}}}}intmain(){string text="ababababab";string p="abab";vector<longlong>q={999983,100003};doRabinKarp(p,text,q);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 22:49:57

Cybertruck整车电气原理图深度拆解:48V架构与区域控制器的未来方向

简介&#xff1a;特斯拉Cybertruck 2023年10月版整车电气原理图是一份面向电动汽车电气工程、维修诊断与线束设计的完整工程图档&#xff0c;适合整车厂工程师、新能源维修技师、汽车电子爱好者深入学习。包体为单份PDF文件&#xff0c;约1.57MB&#xff0c;内容包含整车控制器…

作者头像 李华
网站建设 2026/9/6 22:49:27

通达信三色筹码指标解析:COST与WINNER函数的实战应用

简介&#xff1a;通达信指标公式源码教程&#xff0c;聚焦资金指标‘三色筹码’的编写与可视化&#xff0c;面向希望自定义资金类技术指标的通达信使用者&#xff0c;既适合日常复盘&#xff0c;也可用于选股逻辑优化。文档以VAR1至VAR13系列变量为主线&#xff0c;先定义基准常…

作者头像 李华
网站建设 2026/9/6 22:44:14

SAP技术架构与ERP实施:从三层模型到S/4HANA落地实践

简介&#xff1a;这份PPT是一份面向SAP初学者、ERP实施顾问及企业IT规划人员的体系化入门资料&#xff0c;旨在厘清SAP技术架构与ERP实现方法的核心脉络。内容从NetWeaver集成平台与mySAP商务套件切入&#xff0c;系统讲解SAP总体应用架构中的五级系统&#xff08;从设备控制、…

作者头像 李华
网站建设 2026/9/6 22:40:40

从战略到执行:华为业务管理逻辑如何驱动企业高效增长

简介&#xff1a;一份97页的演示文稿&#xff0c;精选自华为高效增长业务管理逻辑与流程组织力实践&#xff0c;面向企业管理者、流程负责人及数字化转型从业者&#xff0c;聚焦解决业务流程效率低下、执行不力、协同割裂等痛点。内容围绕流程定位、规划、建设、推行、运营、优…

作者头像 李华
网站建设 2026/9/6 22:37:03

WeKnora 本地大模型部署实操:五步跑通本地知识库 RAG 问答

WeKnora 本地大模型部署实操&#xff1a;五步跑通本地知识库 RAG 问答 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://gitcode.c…

作者头像 李华