准备:

字符串比大小:比的就是字符串里每个字符的ASCII码的大小。(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等)

字符串的存储结构:同线性表(顺序存储+链式存储)

  顺序存储结构是一组地址连续的存储单元来存储字符串中的字符序列;按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区,一般用定长数组来定义。——空间分配不灵活,但是字符串一般都是连在一起表述的,”断章取义“的情况并不多,所以习惯上我们还是会直接定义一个足够长度的存储区来存储

  链式存储结构

 

BF算法:

  BoyFriend 、Brute Force

  朴素的模式匹配算法,其核心思想是:

  ——有两个字符串S和T,长度分别为N和M。首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则T向右移动一个字符位置,与S[2]进行比较,而后再依次进行比较。

  ——该算法最坏情况下要进行M*(N-M+1)次比较,时间复杂度为O(M*N)。____效率低下。

(注:在这里S为主串,T为子串,这种子串的定位操作通常称作串的模式匹配)

  存在回溯,需要重头来过,效率低下。

KMP算法:

  克努特-莫里斯-普拉特算法,大大的避免重复遍历的情况(避免不必要的回溯)

  问题由模式匹配串(子串)决定,不是由目标串决定。

  给模式匹配串添加个k数组(即next数组),这是一个”智能“的数组,因为它指导着模式匹配串下一步该用第几号元素进行匹配

    ——k数组元素:k[1]=0,k[2]=1,然后从不匹配元素位置开始往前查看,探讨其前缀与后缀相同元素个数,k[i]即相同元素个数+1。

(解读next数组:当模式匹配串T失配的时候,next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配)

(注:模式匹配串和目标串的下标都是从1开始,0下标存储串的长度)

next数组获取示例演示:

next数组获取代码展示:

 //i(后缀)
//j(前缀)
void get_next(String T, int *next)
{
j = ;
i = ;
next[] = ;
while( i < T[])
{
if(0 == j || T[i] == T[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];//j回溯
}
}
//因为前缀是固定的,后缀是相对的。
}

next数组获取优化:

优化next数组代码如下:

 //优化
//i(后缀)
//j(前缀)
void get_next(String T, int *next)
{
j = ;
i = ;
next[] = ;
while( i < T[])
{
if(j == || T[i] == T[j])
{
i++;
j++;
if(T[i] != T[j])//判断
16 {
17 next[i] = j;
18 }
19 else
20 {
21 next[i] = next[j];
22 }
}
else
{
j = next[j];//j回溯
}
}
//因为前缀是固定的,后缀是相对的。
}

最后KMP.c

 //若存在,返回子串T在主串S第pos个字符之后的位置
//若不存在返回0
int Index_KMP(Stirng S, Stirng T, int pos)
{
int i = pos;
int j = ;
int next[]; get_next(T, next); while(i <= S[] && j <= T[])
{
if( == j || S[i] == T[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j > T[])
{
return i - T[];
}
else
{
return ;
}
}

BF算法 + KMP算法的更多相关文章

  1. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  2. 算法 kmp算法

    kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同. 下面具体说下这两种算法的区别: 主串:BABCDABABCDABCED 从串:ABCDAB ...

  3. 数据结构与算法--KMP算法查找子字符串

    数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...

  4. 经典算法 KMP算法详解

    内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...

  5. 笔记-算法-KMP算法

    笔记-算法-KMP算法 1.      KMP算法 KMP算法是一种改进的字符串匹配算法,KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一 ...

  6. 值得花费一周研究的算法 -- KMP算法(indexOf)

    KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...

  7. 字符串模式匹配算法1 - BF和KMP算法

    在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...

  8. BF、kmp算法

    第七周 字符串匹配 BF算法,kmp算法 BF:时间复杂度为 O(m*n) int Index_BF(SString S, SString T, int pos) { ; while (i <= ...

  9. 串匹配算法讲解 -----BF、KMP算法

      参考文章: http://www.matrix67.com/blog/archives/115     KMP算法详解 http://blog.csdn.net/yaochunnian/artic ...

随机推荐

  1. vs2017搭建自己的nuget服务器

    准备环境 vs2017 第一步  创建一个新的asp.net 空网站 .net框架使用4.6以上版本 (或者在第二部中使用低版本的nuget server) 第二步  打开nuget包管理器 搜索nu ...

  2. spring-cloud-config笔记

    忽略元数据末尾 回到原数据开始处 spring-cloud-config 简单来讲就是spring-cloud实现的分布式配置中心.与之前介绍的开源配置服务方案 disconf是一样的,spring- ...

  3. myeclipse中配置schemaLocation路径,实现xml文件自动提示

    在开发中,XML的xsi:schemaLocation路径都是指向网络,但是这个网络地址有时候很不给力导致工程检验XML格式缓慢.所以有必要再myeclipse中配置本地xsd文件路径,以免每次校验都 ...

  4. Objective-C中.h文件、.m文件中@interface、@synthesize及其它

    很多开发iOS好几年的老鸟,可能都不太分的清.h文件和.m文件里各种结构的用途和区别.最近仔细研究了一下,写一篇文章记下来. 一般的,写一个Class的时候,经常是这种格式(以UIViewContro ...

  5. CodeForces 579b

    B. Finding Team Member time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. Ream的入门使用

    一.介绍 Realm是一个不错的手机平台上的数据库,支持多种编程环境,如:Java.Object-C.React Native.Swift.Xamari等. Realm的官网:https://real ...

  7. Jquery学习笔记(8)--京东导航菜单(2)增加弹框

    京东导航,添加中间的弹框栏,使用position定位,放在左侧栏的li标签里面,成为一个整体,保证鼠标在弹框里的时候,弹框不消失: <!DOCTYPE html> <html lan ...

  8. The Definitive Guide To Django 2 学习笔记(五) 第四章 模板 (一)基本模板系统

    引入模板系统的原因,view中引入硬编码并非明智的选择,设计上的任何改变都会需要改动代码.python代码和HTML代码应该分开,这是多数Web站点的共识,分开会提高效率. 基本模板系统 Django ...

  9. mysql数据库表修改某一列的类型

    下面列出:1.增加一个字段alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认为空alter table use ...

  10. root权限NPM全局安装(-g)仍会权限不够,认识下参数 --unsafe-perm

    环境说明 ganiks@ganiks-ubuntu-trusty-64:/ganiks/parse-server$ npm -v 6.5.0 ganiks@ganiks-ubuntu-trusty-6 ...