声明:图片及内容基于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…
这两天复习数据结构(严蔚敏版),记录第四章串中的两个重要算法,BF算法和KMP算法,博主主要学习Java,所以分析采用Java语言,后面会补上C语言的实现过程. 1.Brute-Force算法(暴力法) 要求:将主串的第i个字符(一般情况i为1)和字串的第一个字符进行比较.若相等,则继续比较后续字符:若不相等,则从主串的下一个字符起,重新与子串的第一个字符比较.成功,返回主串中与子串相匹配的子序列的第一个字符的序号:失败,返回0 public class Brute_Force { /** *…
引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系不如是否相同重要.包括密码验证.hash列等. 而字符串的存储结构有两种:顺序存储结构和链式存储结构.由于不同的字符是连在一起的,所以一般是开足够大的空间进行顺序存储,这样更符合字符串的意义. 一.BF算法实现 一种暴力的.朴素的模式匹配算法,是的,时间复杂度为O(M*N).而下面的KMP算法则是O(M+N)…
考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设目标串S="ababcabcacb",模式串T="abcac",利用BF算法这个过程就会表示为: 将S串理解为数组,底标从0开始,即从a开始,第一次匹配过程如下: ok,当发现T串尚未匹配结束,就开始出现了错误,S串坐标右移+1,开始从b匹配,过程如下: 出现不同,继续…
设有主串s和子串t,子串t的定位就是要在主串中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配. 模式匹配成功是指在目标串s中找到一个模式串t: 不成功则指目标串s中不存在模式串t Brute-Force算法 采用穷举的思路,从目标串s的第一个字符开始和模式串t的第一个字符开始比较 若相等,则继续逐个比较后续字符 不相等则从目标串s的第二个字符开始重新与模式串t的第一个字符进行比较 若匹配成功则返回主串中第一次出现模式串的位置,匹配失败返回-1 以目…
题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 输入输出格式 输入格式: 第一行为一个字符串,即为s1 第二行为一个字符串,即为s2 输出格式: 1行,包含若干整数,表示s2在s1中出现的位置,中间用空格隔开. 输入输出样例 输入样例#1: 输出样例#1: ABABABC 1 3 ABA 很明显,这道题可以用暴力求解字符串匹配.即枚举起点,然后判断是否为子串.时间复杂度为$O(len^2)$.复杂度明显超时. Hash: 一种用正确率换取时间的算…
后缀自己主动机(sam)对字符串匹配 ==== 我们已经配置了一个相对较短的模式字符串sam. 为P="abcabcacab", T[1..i]后缀.因此,它是sam最长前缀长度: T: b a b c b a b c a b c a a b c a b c a b c a c a b  c    1 1 2 3 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 5 6 7 8 9 10 4 假设最长前缀长度是|P|,则表示T[1..i]的后缀和P匹配. 内存使用 可能多个t…
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.算法思想 Bellman-Ford算法时间复杂度比较高,在于Bellman-Ford需要递推n次,每次递推需要扫描所有的边,在递推n次的过程中,很多判断是多余的,所以考虑用队列优化,减少不必要的判断,这种算法称为SPFA(Shortest Path Faster Algorithm) SPFA算法的大致流程就是用一个队列来进行维护,初始时将源点加入队列,每次从队列中取出一个顶点,并对它所有相邻的节点进行松弛,如果某个…
#include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> #include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSTRLEN 255 //用户可在255以内定义最长串长…
var str="abcbababcbababcbababcabcbaba";//主串 var ts="bcabcbaba";//子串 function BF(s,t){//BF算法 var i=0,j=0,v=-1; while(i<s.length&&j<t.length){ if(s[i]==t[j]){//相等就移动指针 i++; j++; } else{//指针归零 i=i-j+1; j=0; } } if(j==t.lengt…