字符串匹配算法---BF及KMP
字符串匹配的一般算法(BF)
以 ABSABABCEF 与 ABCE 为例,求串2与串1匹配的第一个位置的下标(这里即输出 5),一般的,我们可以从串1的起始位置开始与串2比较,若相同则两串都向后移,否则,串1回到第二个位置,串2回到起始位置重新比较。
代码:(以hdu1771为例)
本题用此方法会超时
#include<stdio.h>
int a[10001],b[10001];
int main()
{int t;scanf("%d",&t);while(t--){int m,n;scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&a[i]);for(int j=0;j<m;j++)scanf("%d",&b[j]);int k=0,s=0;while(k<n&&s<m){if(a[k]==b[s]){ //若相同,都向前进k++;s++;}else{k=k-s+1; //若不相同,串1回到k-s+1的位置,串2回到起始位置s=0;}if(s==m){printf("%d\n",k-s+1);break;}}if(s!=m)printf("-1\n");}return 0;
}
字符串匹配KMP算法
从上面一般算法中我们可以看到两字符串需要不断地回溯,这会导致复杂度增加,复杂度为O(M*N),再M,N过大的情况下会超时,因此有了KMP算法。
图1
从上图中可以看出我们不必让串1回溯,串2也不必每次都回溯到起始位置,那么我们怎么判断让串2回溯到什么位置你呢?这里引入字符串前缀和后缀的最长匹配长度,用pmt数组保存,为了方便我们再使用Next数组。
图2.
如图一所示,比较至8的位置开始不相同,那么8之前的7个元素都是相同的,那么由前图2可知长度为7的字符串的前缀和后缀的最长匹配长度为3,所以我们可以知道串2只需要回退到pmt[7-1]的位置,即Next[7]的位置,所以我们用此方法来解决这道题。
AC代码(都以hdu1711为例)
#include<stdio.h>
int a[1000001],b[10001],Next[100001]; //求Next数组
void getNext(int m)
{int i=0,j=-1;Next[0]=-1;while(i<m){if(j==-1||b[i]==b[j]){i++;j++;Next[i]=j;}elsej=Next[j];}return ;
}
int main()
{int t;scanf("%d",&t);while(t--){int m,n;scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&a[i]);for(int j=0;j<m;j++)scanf("%d",&b[j]);int k=0,s=0;getNext(m);while(k<n&&s<m){if(a[k]==b[s]||s==-1){k++;s++;}else{s=Next[s];}if(s==m){printf("%d\n",k-s+1);break;}}if(s!=m)printf("-1\n");}return 0;
}
题1711博客地址:https://blog.csdn.net/Krismile_/article/details/82814151
字符串匹配算法---BF及KMP相关推荐
- 字符串匹配算法BF,BM,KMP
字符串匹配bf算法:(暴力穷举算法) 在一个字符串中寻找另一字符串,最容易想到的,也是最简单的办法是:取主串和模式串/搜索串中的每一位依次比较,如果匹配则同时后移一位继续比较,直至匹配到模式串的最后一 ...
- python实现字符串匹配算法BF,BF改,KMP
包含:BF,BF改进版本,KMP BF:暴力搜索 BF改:当判断匹配失败的字符串是不是与首字母相同 若不同,继续BF算法: 若相同,直接将首字母移到当前位置 KMP:通过前缀与后缀发现待匹配字符串本身 ...
- Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)
今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...
- 字符串匹配算法(三):KMP(KnuthMorrisPratt)算法
文章目录 KMP 原理 next数组的构建 代码实现 KMP 一提到字符串匹配算法,想必大家脑海中想到的第一个必然就是KMP算法,KMP算法的全称叫做KnuthMorrisPratt算法,与上一篇博客 ...
- 4种字符串匹配算法:有限自动机(中)
接着上文(地址),我们来聊一聊自动机算法(有限自动机字符串匹配算法)和KMP算法. ====#=有限自动机算法=#===== 关于有限自动机,网上的分析的资源,大部分都很笼统,算导上的知识点,全是数学 ...
- 字符串匹配算法 golang实现
字符串匹配算法 golang实现 文章目录 字符串匹配算法 golang实现 KMP算法 算法思想 代码 sunday算法 算法思想 代码 KMP算法 算法思想 KMP算法是一种改进的字符串匹配算法, ...
- BF,KMP,BM三种字符串匹配算法性能比较
三种最基本的字符串匹配算法是BF,KMP以及BM,BF算法是最简单直接的匹配算法,就是逐个比较,一旦匹配不上,就往后移动一位,继续比较,所以比较次数很都. 关于KMP和BM的详细介绍可以参考下面的两个 ...
- 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)
图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...
- 数据结构之字符串匹配算法(BF算法和KMP算法)
字符串匹配算法: 就是给定两个串,主串(s)和子串(sub), 查找子串是否在主串里面,如果找到便返回子串在主串中第一个元素的位置下标,否贼返回-1,. 在这里我 们讨论的时候主要用字符串来举例实现. ...
最新文章
- 2014年云计算服务将取代PC电脑
- python顺序表代码_python实现顺序表的简单代码
- tp框架存在的问题 不可多图同时上传
- LinkedBlockingQueue源码
- 使用VS2008在windows平台上试用Kinect
- Bootstrap表单
- html框架集frame是啥意思,HTML框架集frameset和内嵌框架iframe
- Python 集合 day3
- Linux安装redis(6.0.9)环境
- 【计网CRC】模2除法求冗余码
- 如何使用Nginx Ingress实现灰度发布和蓝绿发布?
- 51单片机基础——数码管数组动态显示0—F
- 计算机中硬盘和移动硬盘的区别,笔记本硬盘和移动硬盘有什么区别
- 自来水智慧水务平台(建设方案及项目经验)
- Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题
- leetcode笔记 844比较含退格的字符串 python
- DELL OMSA(SrvAdmin)-监控软件与Promethues结合
- 解决vue3中echarts的tooltip组件不显示的问题
- 二维数组去重,数组对象去重
- 商汤科技2018年校招
热门文章
- DCQCN: Congestion Control for Large-Scale RDMA Deployments-SIGCOMM‘2015不知道写的啥?
- android死机问题
- Ophone手机死机问题
- win10专业版180天bat激活脚本
- java ehcache lru_ehcache缓存淘汰浅析
- Java中将数组转成List
- 数据结构——平衡二叉树的的旋转问题
- Mac 版本ScreenFlow软件英文版安装成功后非英文版,比如日语等,解决方案。
- ABP框架与基础组件介绍
- c52传感器温度显示c语言编程,基于STC89C52的数字温度计 附C语言代码.doc