算法笔记:简单的字符串模式匹配-BF算法
字符串模式匹配是匹配字符串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算法相关推荐
- 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...
- 算法笔记:简单的字符串模式匹配-KMP算法(与BF算法对比时间复杂度)
简单的讲就是字符串不回溯. #include<stdio.h> #include<stdlib.h> #include<string.h>int countBF = ...
- 模式匹配——BF算法
1.BF算法(蛮力匹配): (1)从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则比较后续字符:否则,从主串S的第二个字符开始和模式T的第一个字符进行比较. (2)重复步骤(1),直到 ...
- 算法笔记--简单实现栈的先入后出(FILO,First In Last Out)功能
算法笔记–简单实现栈的先入后出(FILO,First In Last Out)功能 stack 栈,是一个 先入后出(FILO,First In Last Out)的 有序列表,可以形象地理解为手枪的 ...
- 【算法笔记】极客时间 算法面试通关40讲 笔记 覃超
[算法笔记]极客时间 算法面试通关40讲 覃超 [算法笔记]极客时间 算法面试通关40讲 覃超 相关链接 在leetcode 上的题号 数组.链表: (堆)栈stack.队列queue 优先队列 哈希 ...
- >算法笔记-动态规划-最短路径迪杰斯特拉算法
算法笔记-动态规划-最短路径迪杰斯特拉算法 作者:星河滚烫兮 前言 图的最短路径问题在现实生活中有很广阔的应用,最短路径又分为单源最短路径与多源最短路径,前者求出固定起点到其他节点的最短路径,后者 ...
- 字符串的模式匹配--BF算法KMP算法
BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...
- 数据结构:模式匹配BF算法
一.BF算法原理 子串的定位操作通常称为串的模式匹配(其中T称为模式串).这是串的一个重要操作,许多软件,如果有编辑菜单的话,则其中必有查找子菜单项,这就是一个模式匹配问题.. Index(S, T, ...
- 算法笔记 简单贪心(月饼问题)
** 概念 ** 贪心法是求解一类最优问题的方法,它总是考虑当前状态下局部最优(或较优)的策略,来使全局的结果达到最优(或较优).显然,如果采取较优而非最优的策略(最优策略可能不存在或是不易想到),得 ...
最新文章
- shell编程中如何执行oracle语句
- ajax兼容低版本浏览器
- 如何使用APUE源代码(UNIX高级编程)-转
- ehcache 手动刷新缓存_清空DNS缓存的两个小方法
- 解决 No module named PyQt5.QtWebKitWidgets
- Junit第一次使用
- 小甲鱼python学习笔记之函数(一)
- 常用软件运维部署篇(一)--Linux安全加固
- RTKLIB源码解析(三)、 Rinex文件读取(rinex.c)——2
- 计算机二级office基础知识题库,计算机office二级考试题库
- 队列与栈的原理及特点
- 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树
- JavaWeb进阶之路:MyBatis初体验
- Shiro 实战教程(全)
- Linux系统时间、系统时区和时钟同步的部分理解
- Cesium 实战 - 最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层
- Conan软件包管理器的Qt 6.2.4软件包
- leetcode 546. 移除盒子 —— 动态规划
- mysql 增加主键列_MySQL添加列、删除列,创建主键等常用操作总结
- 电信机顶盒怎么连接鸿蒙系统电视,「天翼高清电视」电信高清机顶盒怎么连接电视 - 鲲鹏装修网...