字符串匹配——BF算法,RK算法(暴力求解)(C/C++)
字符串匹配
问题描述:在主串S中寻找模式串T第一次出现的位置,并返回这个位置。
字符串匹配的暴力搜索方法——BF算法#
使用最简单的方法,将模式串与主串进行逐位的比较。
每次偏移量固定设为1,偏移发生在每次失配之后。
代码描述如下:
#include <cstring> using namespace std; // 使用BF暴力搜索 // 逐字符比较主串S中第一个出现的子串T,返回T出现的第一个位置 // 找不到返回-1 int BFstring(char *S, char *T){ int lenS = strlen(S); // 每个串的长度都需要用到 int lenT = strlen(T); int i,j; for(i=0;i<lenS;++i){ for(j=0;j<lenT;j++){ // 逐字符比较 if(S[i+j]!=T[j]) // 出现不匹配 break; // 退出这一轮比较,模式串右移一位 } if(j==lenT) // 当不匹配退出时,j不等于模式串长度! return i; } return -1; // 退出循环没有返回位置,意味着没有找到返回-1 }
字符串匹配的另一种暴力算法——RK算法#
使用哈希函数,使得可以快速判断当前模式串与主串的待匹配子串是否有可能相等。
哈希函数描述:对模式串或子串(主串的待匹配串)逐字符求和,然后取模使其产生哈希冲突的概率降低。
如若为01串,则直接求和即可。
如若为数字串,则求和取模,模数按数字的范围和串长定,一般模26即可。
如若为字符串,则先将字符转换为数字(ASCII码?),然后求和取模,模数一般设置为26即可。
代码描述如下:
#include <cstring> using namespace std; int BKstring(char *S, char *T){ int lenS = strlen(S); int lenT = strlen(T); int hashS(0),hashT(0),i,j; // 初始化哈希值 for(int k=0;k<lenT;k++){ hashS += (S[k] - 'a'); // 假设为串为全小写字母的串 hashT += (T[k] - 'a'); hashS %= 26; hashT %= 26; } // printf("hashT: %d\nhashS: ",hashT); // 比对 for(i=0;i<=lenS-lenT;++i){ // printf("%d, ",hashS); if(hashS == hashT){ int flag=1; for(int k=0;k<lenT;k++){ if(S[i+k]!=T[k]){ flag = 0; break; } } if(flag) return i; } // 不匹配更新hashS hashS -= (S[i] - 'a'); hashS += (S[i+lenT] - 'a'); hashS %= 26; } // putchar('\n'); return -1; }
作者:Mengjie Ye
出处:https://ymj68520.cnblogs.com/
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请 .
如果,您希望更容易地发现我的新文章,不妨点击一下绿色通道的【关注我】。
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现