给定一个主串a和一个模式串b,求模式串是否在主串中出现,若出现了返回首字母的下标,否则返回-1

该bf算法属于一个暴力思想,如果a串的长度为m,b串的长度为n,那么该算法的最坏情况下的时间复杂度为O(m*n)

一般在匹配的时候很难达到O(m*n),故还被广泛应用

程序代码:

#include<stdio.h>
#include<string.h>
char a[110],b[110];
int bf();
int main()
{scanf("%s%s",a,b);printf("%d\n",bf());return 0;
}
int bf()
{int i,j,m,n;m=strlen(a);n=strlen(b);i=0;j=0;while(i<m&&j<n){if(a[i]==b[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j==n)return i-j;return -1;
}

上面的bf算法时间复杂度是O(m*n),接下来介绍一个时间复杂度为O(m+n)的,这个算法就是KMP,说真的,我刚开始学这个算法的时候没理解,只是把它背会了,过了一段时间没用过,然后就忘了,今天我又重新看了一遍,发现之前不理解的地方现在懂了,简单的介绍一下KMP吧,该算法就是进行字符串的匹配,例如主串是T串,子串是P串,那么在进行匹配的时候我们会发现,当有一个字符匹配失败时,不需要回到最初的位置,举个例子吧,如果一个字符串是ababac,当匹配到c时失败了,其实现在不需要回到主串中的一个a的位置。仔细观察子串你会发现,ababa中前三个字符和后三个字符一样,这就意味着,当匹配到c不同时,那么c之前的aba是相同的,所以对于子串来说直接从下标为3的b开始匹配即可,而对于主串来说就是匹配失败的下标的位置,继续往后比即可。

这就牵扯到对子串的处理,需要记录下,在当前位置其最长后缀也是其前缀的长度,即是next数组。

直接来代码吧

程序代码

#include<stdio.h>
#include<string.h>
char T[10010],P[10010];
int next[10010];void GetNext(char *str);int main()
{int lenT,lenP,i,j;scanf("%s%s",T,P);GetNext(P);lenT=strlen(T);lenP=strlen(P);i=0;j=0;while(i<lenT){if(j==0&&T[i]!=P[j])i++;else if(j>0&&T[i]!=P[j])j=next[j-1];else{i++;j++;}if(j==lenP)break;}if(j==lenP)printf("%d\n",i-lenP);elseprintf("-1\n");return 0;
}void GetNext(char *str)
{int len=strlen(str);int i,j;i=1;j=0;next[0]=0;while(i<len){if(j==0&&str[i]!=str[j]){next[i]=0;i++;}else if(j>0&&str[i]!=str[j])j=next[j-1];else{next[i]=j+1;i++;j++;}}
}

字符串模式匹配(bf+KMP)相关推荐

  1. 算法笔记:简单的字符串模式匹配-BF算法

    字符串模式匹配是匹配字符串A中是否存在子串a,一般字符串的结尾为'\0',可以以此作为字符串结束的判定标准. 其过程原理图如下所示: 给出源代码: #include<stdio.h> #i ...

  2. a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)

    串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...

  3. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一 ...

  4. 数据结构---BF字符串模式匹配

    数据结构-BF字符串模式匹配 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> int BF(char * S, cha ...

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

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

  6. KMP算法字符串模式匹配

    KMP字符串模式匹配详解 来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算 ...

  7. KMP字符串模式匹配

    KMP 字符串基本概念 字符串 S:无特殊说明,字符串仅由26个小写字母'a'-'z',并用大写字母表示一个字符串 S="abcd" |S|:表示一个字符串的长度 |S|=4 S[ ...

  8. 字符串模式匹配--KMP之美

    字符串模式匹配: 给定字符串,要求在该字符串(主串)中找到所有匹配一个模式串的子串(一般是返回子串在字符串中的开头位置).这里把问题简化一下--在该字符串中找到第一个匹配对应模式串的子串即可.要找出剩 ...

  9. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的. 且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B ...

  10. iptables --algo 字符串匹配算法 bm kmp

    http://blog.csdn.net/l953972252/article/details/51331001 字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强 ...

最新文章

  1. 人月神话——焦油坑 《读后感》
  2. 学习鸟哥的Linux私房菜笔记(13)——用户管理
  3. 统计字符串中的英文字母的个数C++代码实现
  4. ruby .each_Ruby中带有示例的Array.each方法
  5. String path = request.getContextPath
  6. UDP报文观测以及DNS的工作原理
  7. 大数据分析必不可少之数据仓库
  8. 完整版商城PHP源码小程序,前后端+后台+小程序;访问地址在文末
  9. vfp报表纸张设置_谈VFP9的自定义纸张的设计!
  10. 【正点原子FPGA连载】第一章FPGA简介 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  11. 如何绘制逻辑图 — 8.逻辑的表达:数据逻辑
  12. 0-50A集成式霍尔电流传感器应用案例分享
  13. Android文件系统编译出错记录
  14. 23位子网掩码是多少_子网掩码23位的是多少
  15. MixFormer: End-to-End Tracking with Iterative Mixed Attention解读
  16. 考计算机854的学校,2020年哈尔滨工业大学854计算机基础硕士研究生入学考试科目大纲...
  17. pku_oj: W11-01 最大素数问题 (C++)
  18. 当技术重构遇上DDD,如何实现业务、技术双赢?
  19. 计算机基础知识(下)(操作系统简介)
  20. 破解Android app的过程记录

热门文章

  1. LAMP环境搭建过程中出现的问题——基于VM虚拟CentOS-5.6
  2. python3 列表生成式
  3. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)
  4. Android-入门学习笔记-图片和外观改善
  5. MVC开发中的常见错误-02-在应用程序配置文件中找不到名为“OAEntities”的连接字符串。...
  6. Block代码块中使用局部变量注意点
  7. Emmet 快速编写html代码
  8. 利用Teensy进行EM410x卡模拟以及暴力破解EM410X类门禁系统可行性猜想
  9. AngularJS开发指南
  10. jQuery基本选择器 (实例及表单域 value 的获取)