字符串模式匹配是匹配字符串A中是否存在子串a,一般字符串的结尾为'\0',可以以此作为字符串结束的判定标准。

其过程原理图如下所示:

给出源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define LENGTH 10
typedef unsigned char String[LENGTH + 1];//index = 0存放长度int BF(char *A, char *a)
{int pos = -1;char *B, *b;int ib = 0, iB = 0;B = A;b = a;while (*B != '\0'){if(*b != '\0'){if(*B == *b){b ++;ib ++;B ++;iB ++;}else {B ++;iB ++;}}else {return iB - ib;}}return -1;
}int main(int argc, char **argv)
{char *A, *a;A = "abcdefg123hijk";a = "123";printf("A: %s\n",A);printf("a: %s\n",a);printf("pos: %d\n",BF(A,a));return 0;
}

运行结果:

D:\test>gcc BF.c
D:\test>a.exe
A: abcdefg123hijk
a: 123
pos: 7

然后大家有没有感觉有点奇怪?查找的子串没有回溯!没错,上面的程序是错误的,当我们输入如下:

D:\test>gcc BF.c
D:\test>a.exe
A: abcdabddef
a: abcde
pos: 4

这样就错了,应该返回-1,。正确的算法是:

int BF(char *A, char *a)
{int ia = 0, iA = 0;while(A[iA] != '\0'){if(a[ia] != '\0'){if(A[iA] == a[ia]){ia ++;iA ++;}else {iA = iA - ia +1;ia = 0;}}else {return iA - ia;}}return -1;
}

结果:

D:\test>gcc BF.c
D:\test>a.exe
A: abcdabddef
a: abcde
pos: -1

仔细看上面的代码还是有问题,当模式字符串在主串的结尾处时会出错:

abcdabddef
dddddddddef
-----------------
pos: -1

可以看到字符串匹配上了,但是返回位置不匹配,再次修改一下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int BF(char *A, char *a)
{int ia = 0, iA = 0, ispace;printf("%s\n",A);while(A[iA] != '\0'){if(a[ia] != '\0'){if(A[iA] == a[ia]){printf("%c",a[ia]);ia ++;iA ++;}else {printf("%c\n",a[ia]);iA = iA - ia +1;ia = 0;for(ispace = 0; ispace < iA; ispace++)printf("%c",' ');}}if(ia == strlen(a)) {printf("\n-----------------\n");return iA - ia;}}printf("\n-----------------\n");return -1;
}int main(int argc, char **argv)
{char *A, *a;A = "abcdabddef";a = "ddef";printf("A: %s\n",A);printf("a: %s\n",a);printf("pos: %d\n",BF(A,a));return 0;
}

测试结果:

D:\test>gcc BF.c
D:\test>a.exe
A: abcdabddef
a: ddef
abcdabddef
dddddddddef
-----------------
pos: 6

算法笔记:简单的字符串模式匹配-BF算法相关推荐

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

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

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

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

  3. 模式匹配——BF算法

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

  4. 算法笔记--简单实现栈的先入后出(FILO,First In Last Out)功能

    算法笔记–简单实现栈的先入后出(FILO,First In Last Out)功能 stack 栈,是一个 先入后出(FILO,First In Last Out)的 有序列表,可以形象地理解为手枪的 ...

  5. 【算法笔记】极客时间 算法面试通关40讲 笔记  覃超

    [算法笔记]极客时间 算法面试通关40讲 覃超 [算法笔记]极客时间 算法面试通关40讲 覃超 相关链接 在leetcode 上的题号 数组.链表: (堆)栈stack.队列queue 优先队列 哈希 ...

  6. >算法笔记-动态规划-最短路径迪杰斯特拉算法

    算法笔记-动态规划-最短路径迪杰斯特拉算法 作者:星河滚烫兮 前言   图的最短路径问题在现实生活中有很广阔的应用,最短路径又分为单源最短路径与多源最短路径,前者求出固定起点到其他节点的最短路径,后者 ...

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

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

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

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

  9. 算法笔记 简单贪心(月饼问题)

    ** 概念 ** 贪心法是求解一类最优问题的方法,它总是考虑当前状态下局部最优(或较优)的策略,来使全局的结果达到最优(或较优).显然,如果采取较优而非最优的策略(最优策略可能不存在或是不易想到),得 ...

最新文章

  1. shell编程中如何执行oracle语句
  2. ajax兼容低版本浏览器
  3. 如何使用APUE源代码(UNIX高级编程)-转
  4. ehcache 手动刷新缓存_清空DNS缓存的两个小方法
  5. 解决 No module named PyQt5.QtWebKitWidgets
  6. Junit第一次使用
  7. 小甲鱼python学习笔记之函数(一)
  8. 常用软件运维部署篇(一)--Linux安全加固
  9. RTKLIB源码解析(三)、 Rinex文件读取(rinex.c)——2
  10. 计算机二级office基础知识题库,计算机office二级考试题库
  11. 队列与栈的原理及特点
  12. 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树
  13. JavaWeb进阶之路:MyBatis初体验
  14. Shiro 实战教程(全)
  15. Linux系统时间、系统时区和时钟同步的部分理解
  16. Cesium 实战 - 最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层
  17. Conan软件包管理器的Qt 6.2.4软件包
  18. leetcode 546. 移除盒子 —— 动态规划
  19. mysql 增加主键列_MySQL添加列、删除列,创建主键等常用操作总结
  20. 电信机顶盒怎么连接鸿蒙系统电视,「天翼高清电视」电信高清机顶盒怎么连接电视 - 鲲鹏装修网...

热门文章

  1. 2019.8.15几道练习题
  2. VBA精彩代码分享-4
  3. 文献阅读005【精读】
  4. 4-3-串的块链存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
  5. Entity Framework关联实体的三种加载方法
  6. 用border做三角形
  7. iphone开发中sqlite3说明
  8. Java JDBC初步
  9. 华为公司参加2006 CCBN广电信息网络展览会
  10. mysql 备份数据库结账_用余额快照秒级导出实现财务报表