字符串匹配之BF算法
1)算法原理
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。
BF算法是一种蛮力算法。
举例说明:
S: ababcababa
P: ababa
BF算法匹配的步骤如下:
|
i=0, j=0 |
i=1, j=1 |
i=2,j=2 |
i=3, j=3 |
i=4, j=4(失败) |
|
ababcababa |
ababcababa |
ababcababa |
ababcababa |
ababcababa |
|
ababa |
ababa |
ababa |
ababa |
ababa |
|
i=1,j=0(失败) |
|
ababcababa |
|
ababa |
|
i=2,j=0 |
i=3,j=1 |
i=4,j=2(失败) |
|
ababcababa |
ababcababa |
ababcababa |
|
ababa |
ababa |
ababa |
|
i=3,j=0(失败) |
|
ababcababa |
|
ababa |
|
i=4,j=0(失败) |
|
ababcababa |
|
ababa |
|
i=5,j=0 |
i=6,j=1 |
i=7,j=2 |
i=8,j=3 |
i=9,j=4(成功) |
|
ababcababa |
ababcababa |
ababcababa |
ababcababa |
ababcababa |
|
ababa |
ababa |
ababa |
ababa |
ababa |
(2)代码实现
#include <stdio.h>
#include <string.h>
int BFMatch(char *s,char *p)
{
int i,j;
i =0;
while(i < strlen(s))
{
j = 0;
while(s[i] == p[j] &&j<strlen(p))
{
i++;
j++;
}
if(strlen(p) == j)
{
return i - strlen(p);
}
i = i - j + 1; // 指针i回溯
}
return -1;
}
int main()
{
char *szSource = "ababcababa";
char *szSub = "ababa";
int index =BFMatch(szSource, szSub);
printf("目标串包含匹配串的起始位置:%d",index);
}
(3)运算过程
(a) i=0, j=0, s[0]==p[0];
i=1,j=1, s[1]==p[1];
i=2,j=2, s[2]==p[2];
i=3,j=3, s[3]==p[3];
i=4,j=4, s[[4]!=p[4], 第一次循环结束,i=4-4+1=1
(b) i=1, j=0, s[1]!=p[0],第二次循环结束, i=1-0+1=2
(c) i=2, j=0, s[2]==p[0];
i=3, j=1, s[3]==p[1];
i=4, j=2, s[4]!=p[2]; 第三次循环结束,i=4-2+1=3
(d) i=3, j=0, s[3]!=p[0];第四次循环结束,i=3-0+1=4
(e) i=4, j=0, s[4]!=p[0];第四次循环结束,i=4-0+1=5
(f) i=5, j=0, s[5]==p[0];
i=6, j=1; s[6]==p[1];
i=7, j=2, s[7]==p[2];
i=8, j=3, s[8]==p[3];
i=9, j=4, s[9]==p[4];
i=10, j=5, j==strlen(p), 最后一次循环结束,返回i-strlen(p) = 5
(4)运行结果
目标串包含匹配串的起始位置:5
字符串匹配之BF算法的更多相关文章
- 实现字符串匹配的KMP算法
KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s. 首先我们从整体来把我这个算法的思想. 字符串匹配的朴素算法: 我们容易想到朴素算法, ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 字符串匹配的 Boyer-Moore 算法
上一篇文章,我介绍了 字符串匹配的KMP算法 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的” 查找” 功能(Ctrl+F),大多采用 Boyer-Moore 算法. 下面,我根据 M ...
- 字符串匹配的 KMP算法
一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...
- 字符串匹配的kmp算法 及 python实现
一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...
- HDU 1711 Number Sequence (字符串匹配,KMP算法)
HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...
- 字符串匹配(KMP 算法 含代码)
主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...
- 字符串匹配的BF算法和KMP算法学习
引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系 ...
- 字符串匹配(BF算法和KMP算法及改进KMP算法)
#include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...
随机推荐
- SQL Server DATEADD() 函数 一步步使用教程
SQL Server DATEADD() 函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. DATEADD(datepart,number,date)date 参数是合法的日期表达式. ...
- 三 PrePareStatement注入,DELETE和TRUNCATE
PreparedStatement PreparedStatement是一个接口,它继承了Statement,该接口有以下几个优点: 性能比Statement高,会把sql预编译 可以解决sql注入问 ...
- JuJu团队1月9号工作汇报
JuJu团队1月9号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 飞飞 将示例程序打包成exe 将crossentrophy和softmax连接起来 无 婷婷 -- 完善ma ...
- windows制作动态链接库和使用二
动态库的另一种制作方法: 不使用_declspec(dllexport)关键字,使用.def文件 //exportFun.def 文件名随意 EXPORT add @ //格式 函数名 @编号 < ...
- node - multer 加图片后缀
var multer = require('multer') var storage = multer.diskStorage({ destination: function (req, file ...
- redheat7 sd 0:0:0:0: [sda] Assuming drive cache: write through(未解决)
以下是我上网查找的解决办法 1. sd 0:0:0:0: [sda] Assuming drive cache: write through 解决方法:/etc/default/grub 文件里去掉 ...
- 007.Delphi插件之QPlugins,插件的卸载和重新加载
效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- Java基础学习总结(一)——Java开发学习介绍
Java平台: 1.J2SE java开发平台标准版 2.J2EE java开发费平台企业版 Java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序.不同的系统上要安装对 ...
- Install and Configure NFS Server on RHEL 8 / CentOS 8
https://computingforgeeks.com/install-and-configure-nfs-server-on-centos-rhel/
- 5款国内免费CDN服务商及使用点评
第一款,百度加速乐 加速乐目前被百度收购,这样百度也有了自己运营的CDN产品,可以丰富自身站长平台工具使用用户群.目前有免费用户和付费用户的区别,对于一般的网站免费方案也足够使用.特点具备智能解析.加 ...