字符串匹配-BF算法和KMP算法
声明:图片及内容基于https://www.bilibili.com/video/av95949609
BF算法
原理分析
Brute Force 暴力算法
用来在主串中查找模式串是否存以及出现位置







核心就是回溯
如果模式串下标 j 始终没有到达'\0'则没有找到
如果主串下标 i 最后到达了'\0'则没有找到
复杂度分析


完整代码
#include<iostream>
using namespace std;
int BF(char S[], char T[]) {
int i = 0, j = 0,start=0;
while (S[i]!='\0'&&T[j]!='\0') {
if (S[i] == T[j]) { //相等的话,i,j都后移一位
i++; j++;
}
else { //一旦有不相等的,回溯。i回到起始位置加一,j回到模式串头
start++;
i = i - j + 1;
j = 0;
}
}
if (T[j] == '\0') return start; //也可以return i-j;
//if (S[i] == '\0') return -1; //主串到达'\0'说明没找到
else return -1; //模式串没到达'\0'说明没找到
}
int main() {
char S[] = "DABCDABD";
char T[] = "ABD";
int i=BF(S, T);
if (i>=0) {
cout << "已找到,在主串下标为"<<i<<"的地方"<<endl;
}
else cout << "未找到" << endl;
return 0;
}
KMP算法
原理分析
比BF算法高效,区别是主串的下标 i 不会回溯,一直前进。而模式串下标 j 回溯到特定位置。
关键是模式串找最大的相同的前后缀,用next数组记录前后缀字符数。

对模式串回溯的正确性分析:如上图已经找到模式串中最大长度的相等的前后缀且模式串前后缀以及中间的元素已经与主串匹配。
模式串中ab!=cd,故模式串中ab!=主串中cd,模式串中的前缀ab没有再与主串比较的必要,故模式串下标 j 移动到c,主串下标 i 不动
next数组






完整代码
#include<iostream>
using namespace std;
void getNext(char *T, int *next) {
int j = -1; //前缀
int i = 0; //后缀
next[0] = -1;
while (i < strlen(T)) {
if (j == -1 || T[i] == T[j] ){
i++; j++;
next[i] = j;
}
else {
j=next[j]; //回溯
}
}
}
int KMP(char S[], char T[],int *next) {
int i = 0, j = 0;
int lengthS = strlen(S);
int lengthT = strlen(T);
while (i < lengthS && j < lengthT) {
if (j== -1||S[i] == T[j]) {
i++; j++;
}
else {
j = next[j];
}
}
if (j == lengthT) return (i - j);
else return -1;
} int main() {
char S[] = "DABCDABD";
char T[] = "ABC";
int next[100];
getNext(T,next);
int i = KMP(S, T,next);
if (i>=0) {
cout << "已找到,在母串下标为"<<i<<"的地方"<<endl;
}
else cout << "未找到" << endl; return 0;
}
BF算法和KMP算法比较

在KMP算法中 j == -1因为next数组next[0]= -1,得到 j 可能为-1
字符串匹配-BF算法和KMP算法的更多相关文章
- BF算法和KMP算法
这两天复习数据结构(严蔚敏版),记录第四章串中的两个重要算法,BF算法和KMP算法,博主主要学习Java,所以分析采用Java语言,后面会补上C语言的实现过程. 1.Brute-Force算法(暴力法 ...
- 字符串匹配(BF算法和KMP算法及改进KMP算法)
#include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...
- 字符串匹配的BF算法和KMP算法学习
引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系 ...
- 串匹配模式中的BF算法和KMP算法
考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设 ...
- 串的模式匹配 BF算法和KMP算法
设有主串s和子串t,子串t的定位就是要在主串中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配. 模式匹配成功是指在目标串s中找到一个模式串t: 不成功则 ...
- BF算法和KMP算法 python实现
BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...
- BF算法和KMP算法(javascript版本)
var str="abcbababcbababcbababcabcbaba";//主串 var ts="bcabcbaba";//子串 function BF( ...
- 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法
一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...
- 【数据结构与算法】字符串匹配(Rabin-Karp 算法和KMP 算法)
Rabin-Karp 算法 概念 用于在 一个字符串 中查找 另外一个字符串 出现的位置. 与暴力法不同,基本原理就是比较字符串的 哈希码 ( HashCode ) , 快速的确定子字符串是否等于被查 ...
随机推荐
- [Golang]-2 Map关联数组与下划线(_)的意义
目录 map 下划线(underscore) 用在import 用在返回值 用在变量 map map 是 Go 内置关联数据类型(在一些其他的语言中称为哈希 或者字典 ). func main() { ...
- Atlas 读写分离 & Atlas + MHA 故障自动恢复
目录 Atals 介绍 Atlas 主要功能 Atlas 相对于官方 MySQL-Proxy 的优势 Atlas 使用 Atlas 安装 Atlas 目录 Atlas 配置 Atlas 启动 Atla ...
- Codeforces13C–Sequence (区间DP)
题目大意 给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少? 题解 一个很显然的结果就是,变化后的每一个值肯定是等于原来序列的某个值,因为 ...
- HDU 4335 What is N?(指数循环节)题解
题意: 询问有多少数\(n\)满足\(n^{n!}\equiv b\mod p \land\ n\in[1,M]\),数据范围:\(M\leq2^{64}-1,p\leq1e5\) 思路: 这题显然要 ...
- HEVC Advance & H.265 专利费
HEVC Advance & H.265 专利费 https://www.hevcadvance.com/pdfnew/HEVC_Advance_Program_Overview_cn.pdf
- javascript IIFE in depth
javascript IIFE in depth function type 函数表达式 x = function (){ console.log(x); } ƒ (){ console.log(x) ...
- 2019 front-end job Interview
2019 front-end job Interview 2019 前端面试题 掘金 https://juejin.im/tag/面试 https://juejin.im/post/5c875791e ...
- Fast R-CNN训练自己的数据集时遇到的报错及解决方案
最近使用Fast R-CNN训练了实验室的数据集,期间遇到一些报错,主要还是在配置环境上比较麻烦,但可以根据提示在网上找到解决这些错误的办法.这里我只记录一些难改的报错,以后再遇见这些时希望能尽快解决 ...
- 1. VUE介绍
今天开始系统学习vue前端框架. 我是有前端基础的, 刚工作那会, 哪里分那么清楚啊, 前后端我都得做, 所以, css, js, jquery, bootstrap都会点, 还系统学过ext, 哈哈 ...
- 对Innodb中MVCC的理解
一.什么是MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(如MySql)引擎实现中常用的处理读写冲突的手段,目的在于提 ...