准备:

字符串比大小:比的就是字符串里每个字符的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. 产品经理PM

    首先希望大家记住的就是,千万不要以为产品经理是什么高大上的光环,产品经理其实只是一种状态,一种心态而已. 大家可能看到BAT每年都会从校园里面招聘一些产品经理,尤其是我们腾讯,声称以产品为王,每年投产 ...

  2. 360极速浏览器无法正确getHours

    开发了一个显示时间的功能. 功能是这样的,首先从数据库中读取时间,然后显示到前端页面上. 数据库中:2017-08-10 14:25:35.867 前端显示:2017-08-10T14:25:35.8 ...

  3. Unity3D-rigidBody.velocity

    还有半小时就下班了.写一下今天遇到的问题.处理方法以及一些自己的理解.理解的不一定对,还希望大家指正. 今天我做的效果是,hero的移动. 曾经做过用的是transform.Translate(Vec ...

  4. 【Java集合源代码剖析】TreeMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36421085 前言 本文不打算延续前几篇的风格(对全部的源代码加入凝视),由于要理解透Tr ...

  5. Lintcode---实现 Trie

    实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 注意事项 你可以假设所有的输入都是小写字母a-z. 您在真实的面试中是否遇到过这个题? Yes 样例 ...

  6. win10 清理winsxs文件夹

    dism /online /cleanup-image /startcomponentcleanup /resetbase

  7. Atitit.故障排除系列---NoClassDefFoundError  NoClassDefFoundError ClassNotFoundException

    Atitit.故障排除系列---NoClassDefFoundError  NoClassDefFoundError ClassNotFoundException 1. java.lang.Class ...

  8. [gj]来公司停电了-维护机器

    停电出现的问题 一早来机房跳闸了. 很多vm手动起来后有些服务不太正常了. 机房锁坏了.不知道谁进去干啥了.导致跳闸 闸门不知道在哪里.导致所有机器停电了 牵扯到的技术点: 1,nexus启动. ng ...

  9. SQL 数据库分页语句

    declare @pagesize integer,@cpage integer; ; ; SELECT TOP (@pagesize) * FROM (SELECT row_number() ove ...

  10. 170. Rotate List【medium】

    Given a list, rotate the list to the right by k places, where k is non-negative.   Example Given 1-& ...