字符串匹配的一般算法(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相关推荐

  1. 字符串匹配算法BF,BM,KMP

    字符串匹配bf算法:(暴力穷举算法) 在一个字符串中寻找另一字符串,最容易想到的,也是最简单的办法是:取主串和模式串/搜索串中的每一位依次比较,如果匹配则同时后移一位继续比较,直至匹配到模式串的最后一 ...

  2. python实现字符串匹配算法BF,BF改,KMP

    包含:BF,BF改进版本,KMP BF:暴力搜索 BF改:当判断匹配失败的字符串是不是与首字母相同 若不同,继续BF算法: 若相同,直接将首字母移到当前位置 KMP:通过前缀与后缀发现待匹配字符串本身 ...

  3. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  4. 字符串匹配算法(三):KMP(KnuthMorrisPratt)算法

    文章目录 KMP 原理 next数组的构建 代码实现 KMP 一提到字符串匹配算法,想必大家脑海中想到的第一个必然就是KMP算法,KMP算法的全称叫做KnuthMorrisPratt算法,与上一篇博客 ...

  5. 4种字符串匹配算法:有限自动机(中)

    接着上文(地址),我们来聊一聊自动机算法(有限自动机字符串匹配算法)和KMP算法. ====#=有限自动机算法=#===== 关于有限自动机,网上的分析的资源,大部分都很笼统,算导上的知识点,全是数学 ...

  6. 字符串匹配算法 golang实现

    字符串匹配算法 golang实现 文章目录 字符串匹配算法 golang实现 KMP算法 算法思想 代码 sunday算法 算法思想 代码 KMP算法 算法思想 KMP算法是一种改进的字符串匹配算法, ...

  7. BF,KMP,BM三种字符串匹配算法性能比较

    三种最基本的字符串匹配算法是BF,KMP以及BM,BF算法是最简单直接的匹配算法,就是逐个比较,一旦匹配不上,就往后移动一位,继续比较,所以比较次数很都. 关于KMP和BM的详细介绍可以参考下面的两个 ...

  8. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  9. 数据结构之字符串匹配算法(BF算法和KMP算法)

    字符串匹配算法: 就是给定两个串,主串(s)和子串(sub), 查找子串是否在主串里面,如果找到便返回子串在主串中第一个元素的位置下标,否贼返回-1,. 在这里我 们讨论的时候主要用字符串来举例实现. ...

最新文章

  1. 2014年云计算服务将取代PC电脑
  2. python顺序表代码_python实现顺序表的简单代码
  3. tp框架存在的问题 不可多图同时上传
  4. LinkedBlockingQueue源码
  5. 使用VS2008在windows平台上试用Kinect
  6. Bootstrap表单
  7. html框架集frame是啥意思,HTML框架集frameset和内嵌框架iframe
  8. Python 集合 day3
  9. Linux安装redis(6.0.9)环境
  10. 【计网CRC】模2除法求冗余码
  11. 如何使用Nginx Ingress实现灰度发布和蓝绿发布?
  12. 51单片机基础——数码管数组动态显示0—F
  13. 计算机中硬盘和移动硬盘的区别,笔记本硬盘和移动硬盘有什么区别
  14. 自来水智慧水务平台(建设方案及项目经验)
  15. Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题
  16. leetcode笔记 844比较含退格的字符串 python
  17. DELL OMSA(SrvAdmin)-监控软件与Promethues结合
  18. 解决vue3中echarts的tooltip组件不显示的问题
  19. 二维数组去重,数组对象去重
  20. 商汤科技2018年校招

热门文章

  1. DCQCN: Congestion Control for Large-Scale RDMA Deployments-SIGCOMM‘2015不知道写的啥?
  2. android死机问题
  3. Ophone手机死机问题
  4. win10专业版180天bat激活脚本
  5. java ehcache lru_ehcache缓存淘汰浅析
  6. Java中将数组转成List
  7. 数据结构——平衡二叉树的的旋转问题
  8. Mac 版本ScreenFlow软件英文版安装成功后非英文版,比如日语等,解决方案。
  9. ABP框架与基础组件介绍
  10. c52传感器温度显示c语言编程,基于STC89C52的数字温度计 附C语言代码.doc