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算法的更多相关文章

  1. 实现字符串匹配的KMP算法

    KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s. 首先我们从整体来把我这个算法的思想. 字符串匹配的朴素算法: 我们容易想到朴素算法, ...

  2. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  3. 字符串匹配的 Boyer-Moore 算法

    上一篇文章,我介绍了 字符串匹配的KMP算法 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的” 查找” 功能(Ctrl+F),大多采用 Boyer-Moore 算法. 下面,我根据 M ...

  4. 字符串匹配的 KMP算法

    一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...

  5. 字符串匹配的kmp算法 及 python实现

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  6. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  7. 字符串匹配(KMP 算法 含代码)

    主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...

  8. 字符串匹配的BF算法和KMP算法学习

    引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系 ...

  9. 字符串匹配(BF算法和KMP算法及改进KMP算法)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...

随机推荐

  1. IdentityServer4专题之五:OpenID Connect及其Client Credentials流程模式

    1.基于概念 OAuth2.0与身份认证协议的角色映射 OpenID Connect 这个协议是2014颁发的,基于OAuth2.0,在这个协议中,ID Token会和Access Token一起发回 ...

  2. kali打开networkmanager

    有时候可能在用网卡时,或者是其他情况下关闭了networkmanager,而要管理网络这个又是必须的,需要我们手动打开. 没有网络管理器是这样的: 有管理器是这样的: 不多废话了,用命令/etc/in ...

  3. arm linux 移植 x265

    背景 本来想着把 x265编译到ffmpeg里面,搞定了x265的编译:但是一直报ERROR: x265 not found using pkg-config这个错误,我按照网上的资料,查看了ffbu ...

  4. C++Review15_内存管理

    一.野指针 定义指针变量时最好初始化为NULL: 内存回收后,指针也用完了,这时候也需要及时将指针置为NULL: 指针就像野狗一样,为了防止它乱指,除了在使用期间,别的时候都需要置为NULL.这样它就 ...

  5. Vue - 定义使用组件

    import Card from './components/Card.vue' Vue.component('m-card',Card)   // component是注册全局组件,在实例化VUE前 ...

  6. python实现进程的三种方式及其区别

    在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...

  7. springmvc线程安全问题

    对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截.struct2为每一个请求都实例化一个action所以不存在线程安全 ...

  8. 001.Delphi插件之QPlugins,一个最简单的插件

    安装QPlugins里面的Demo,复制粘贴着写了一个最简单的插件,看看好不好用 EXE代码如下: unit Main_Frm; interface uses Winapi.Windows, Wina ...

  9. 吴裕雄--天生自然java开发常用类库学习笔记:System类

    public class SystemDemo01{ public static void main(String args[]){ long startTime = System.currentTi ...

  10. 载域和运行域的理解(ARM程序是怎么运行的)

    对ARM加载域和运行域的理解 一般而言,一个程序包括只读的代码段和可读写的数据段.在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly):可读写的全局变量和静态变量被称作RW段( ...