字符串匹配-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 ) , 快速的确定子字符串是否等于被查 ...
随机推荐
- Python:装饰器是如何调用的
应用举例:(1)装饰器 # 装饰器的调用: # 一旦用上装饰器会: # 第一步:调outer函数 # 第二步:被装饰的函数play_game会被当作参数fn给outer # 第三步:最后调用play_ ...
- windows cmd 查看远程连接端口
查看远程端口号 Cmd tasklist /svc 在输出的内容中查找svchost.exe进程下termservice服务对应的PID,在此查看的PID为:276 然后输入命令:netstat ...
- javascript输出数据到文件
function export(name, data) { var urlObject = window.URL || window.webkitURL || window var export_bl ...
- css scroll text without wrap & webkit-scrollbar
css scroll text without wrap hidden webkit-scrollbar .tabs-title-box::-webkit-scrollbar, .tabs-conte ...
- XSS (跨站脚本攻击) 的原理分析,测试 && 应对措施
1 1 1 XSS (跨站脚本攻击) 的原理分析,测试 1 demo: <!DOCTYPE html> <html lang="en"> <head& ...
- web & js & touch & gesture
web & js & touch & gesture 触摸 & 手势 https://caniuse.com/#feat=touch js https://develo ...
- mobile app & ppi & dpi & px
mobile app & ppi & dpi & px How do dp, dip, dpi, ppi, pixels and inches relate? https:// ...
- Redis all in one
Redis all in one Redis: REmote DIctionary Server https://redis.io/topics/quickstart Download, extrac ...
- js currying function All In One
js currying function All In One js 实现 (5).add(3).minus(2) 功能 例: 5 + 3 - 2,结果为 6 https://stackoverflo ...
- Flatten Arrays & flat() & flatMap()
Flatten Arrays & flat() & flatMap() https://alligator.io/js/flat-flatmap/ "use strict&q ...