字符串模式匹配
模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种串处
理系统中最重要的运算之一。

BF算法

布鲁特-福斯算法
从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字
符进行后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中每个字符依次与主串中的一个连续的字符序列相等时为止,此时称为匹配成功;如果在主串中不存在与模式串相同的子串,则匹配失败。

图解过程

给定主串“ABCDABCDABBABCDABCDABDD”,子串“ABCDABD”
1、第一趟比较,先比较 A,然后是 BCDAB。

在比较最后一个字符 D 时,不匹配。

2、第二趟比较,主串回退到比前一趟加 1 的位置。子串从 0 开始。第一个就不匹配。结束本趟。

3、第三趟比较,主串回退到比前一趟加 1 的位置,子串从 0 开始。第一个还是不匹配。同样结束本趟。

……
i、第 i 趟比较,找到可以匹配的子串

/***************************************************************** 函数名称:searchFS* 功能描述:布鲁特-福斯模式匹配* 参数说明:src, 主串*            sub, 模式串* 返 回 值:-1,表示不成功,非0的值表示模式串sub在主串src的位置
*****************************************************************/
int searchFS(const char *src, const char*sub)
{int i, j;i = 0;j = 0;int strLen = strlen1(src);int tLen = strlen1(sub);while (i<strLen && j<tLen){if (src[i] == sub[j]){++i;++j;}else{//主串回退i = i - j + 1;//子串j = 0;}}if (j >= tLen){return (i - tLen);}return -1;
}int searchFS(const char *src, const char*sub, int pos)
{int i, j;i = pos;j = 0;int strLen = strlen1(src);int tLen = strlen1(sub);while (i<strLen && j<tLen){if (src[i] == sub[j]){++i;++j;}else{//主串回退i = i - j + 1;//子串j = 0;}}if (j >= tLen){return (i - tLen);}return -1;
}/***************************************************************** 函数名称:searchFSAll* 功能描述:查找模式串在主串中所有的出现的位置* 参数说明:locArr, 位置的数组*          src, 主串*            sub, 模式串* 返 回 值:0,表示没有匹配的,非值,表示有匹配的个数
*****************************************************************/
int searchFSAll(int locArr[],const char *src, const char *sub)
{//调用int i = 0;int srcLen = strlen1(src);int subLen = strlen1(sub);//int res = searchFS(src, sub, 0);//if (res != -1)//{//找到了 , res是当前的一个位置 (排除 ABABACDABAC   ABA)// //记录res//   locArr[i] = res;// i++;//    res += subLen;//  res = searchFS(src, sub, res);//}int res = 0;int bj = 0;while ((res = searchFS(src, sub, res)) != -1){++bj;//表示找到一个,加1locArr[i] = res;i++;res += subLen;}return bj;
}

代码实现

#include<stdio.h>
#include<string.h> int BF(const char*s,const char*p)
{int lens=strlen(s);int lenp=strlen(p);if(s==NULL||p==NULL||lenp>lens) return -1;int i=0;int j=0;while(i<lens&&j<lenp){if(s[i]==p[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j==lenp){return i-j;}return -1;}int main()
{const char *s="ababcabcdabcde";const char *p="abcd";printf("%d\n",BF(s,p));return 0;
}

增加pos位置的方法

#include<stdio.h>
#include<string.h> int BF(const char*s,const char*p,int pos)
{int lens=strlen(s);int lenp=strlen(p);if(s==NULL||p==NULL||lenp>lens) return -1;int i=pos;int j=0;while(i<lens&&j<lenp){if(s[i]==p[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j==lenp){return i-j;}return -1;}int main()
{const char *s="ababcabcdabcde";const char *p="abcd";printf("%d\n",BF(s,p,6));return 0;
}

性能分析

637-字符串模式匹配-BF算法相关推荐

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

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

  2. 模式匹配——BF算法

    1.BF算法(蛮力匹配): (1)从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则比较后续字符:否则,从主串S的第二个字符开始和模式T的第一个字符进行比较. (2)重复步骤(1),直到 ...

  3. 字符串的模式匹配--BF算法KMP算法

    BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...

  4. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  5. 数据结构:模式匹配BF算法

    一.BF算法原理 子串的定位操作通常称为串的模式匹配(其中T称为模式串).这是串的一个重要操作,许多软件,如果有编辑菜单的话,则其中必有查找子菜单项,这就是一个模式匹配问题.. Index(S, T, ...

  6. 算法笔记:简单的字符串模式匹配-KMP算法(与BF算法对比时间复杂度)

    简单的讲就是字符串不回溯. #include<stdio.h> #include<stdlib.h> #include<string.h>int countBF = ...

  7. 字符串模式匹配KMP算法详解(Python语言)

    问题描述 主串为 ′ababcabcacbab′ ′ a b a b c a b c a c b a b ′ 'ababcabcacbab',模式串为 ′abcac′ ′ a b c a c ′ 'a ...

  8. 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一.实验目的 1.了解串的基本概念. 2.掌握串的模式匹配算法的实现 . 二.实验预习 说明以下概念 1.模式匹配: 串的模式匹配就是子串的定位运算. 设有两个字符串 S 和 T ,S为主串(正文串) ...

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

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

  10. 字符串模式匹配——最长公共子序列与子串 KMP 算法

    最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, ...

最新文章

  1. AB1601中使用定时器来进行延时的弊端
  2. Linux df指令
  3. RPC框架系列——Protocol Buffers
  4. 二叉树最近公共祖先 LCA
  5. 蓝桥杯 ALGO-118 算法训练 连续正整数的和
  6. sphinx php 扩展安装
  7. NETBIOS/NETBEUI 协议 SAMBA
  8. 新唐NUC980读取U盘配置
  9. Echarts 三维地图
  10. 【UnityWebGL】导出WebGL的问题汇总(持续更新)
  11. 计算机中的物理结构,文件的物理结构_文件的物理结构有哪3种,分别具备什么优缺点...
  12. 【Map】map集合及特点_IDEA中Debug追踪
  13. PTA---计算天数
  14. Element-UI学习之旅-Border边框及图标
  15. 关于println()和print()的区别
  16. 生成好看的海底地形图
  17. 一个博弈游戏,据说智商130才看的懂
  18. r5处理器_入门级游戏党核显平台!R5-3400G核显游戏组装配置清单
  19. 以太坊学习路线——(五)DApp开发:简易版去中心化微博
  20. 村子中有50个人,每人有一条狗

热门文章

  1. 使用 craco 对 cra 项目进行构建优化
  2. AI资源对接需求汇总: 第4期
  3. 图像mnf正变换_PIE SDK最小噪声变换
  4. 第二工业大学计算机应用大专录取分,上海第二工业大学2017年分省分专业录取分数线...
  5. oCPC实践录 | 成本优化策略之eCPC(2)
  6. hdu 3987 Harry Potter and the Forbidden Forest
  7. python答题系统设计
  8. 工作两年的程序媛,岁月在脸上留下了太多
  9. 电脑下载路径与安装路径设置 以及浏览器推荐
  10. 关于gitlab报错 would clobber existing tag 的解决办法