字符串匹配之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> ...
随机推荐
- taucs库的使用方法(VS2012)
第一步:到taucs主页下载taucs,我下载的是:Version 2.2 of the code, with external libraries 第二步:在visual studio tools下 ...
- LeetCode 297.序列化二叉树 - JavaScript
题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法 ...
- MVC5仓库管理系统
下载
- vue题型
一 v-show和v-if区别 个人理解 相同:v-show和v-if都能控制元素的显示和隐藏.两个都是开关. 区别: 1.v-if 是懒加载,是有条件的渲染,它会确保在切换过程中添加或者删除元素. ...
- 删除C代码中的注释行【状态机】
今天在学ruby时遇到的一个经典的题目,一直都知道但从来没有实现过.呈上状态机,代码略.(写代码的时候还是需要注意一些小情况的)
- python SSTI tornado render模板注入
原理tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传 ...
- 关于list
//问题一: List<string> list = new List<string>(); list = null; //这样写可以使用,但是当list值为null时会报未将 ...
- C# enable为false时不变颜色
[System.Runtime.InteropServices.DllImport("user32.dll ")] public static ex ...
- MYSQL登录及常用命令
1.mysql服务的启动和停止 mysql> net stop mysql mysql> net start mysql 2.登陆mysql mysql> 键入命令mysql -ur ...
- oracle 导出时报错EXP-00011:table不存在
oracle11g,在用exp命令备份数据库时,如果表中没有数据报EXP-00011错误,对应的表不存在.这导致对应的空表无法备份. 原因:11g默认创建一个表时不分配segment,只有在插入数据时 ...