假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?

Ps:文本串S可以类比为一篇文章,P为其中某个单词,查找这个单词在文章中哪里出现过。

方法1:暴力匹配

如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:

如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;

如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。

方法2:kmp算法

假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置

如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;

如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。

换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值(next 数组的求解会在下文的详细阐述),即移动的实际位数为:j - next[j],且此值大于等于1。

【next 数组】的含义:

代表当前字符之前的字符串中,有多大长度的相同前缀后缀。例如如果 next [j] = k ,代表j 之前的字符串中有最大长度为 k 的相同前缀后缀。意味着在某个字符失配时,该字符对应的next 值会告诉你下一步匹配中,模式串应该跳到哪个位置(跳到next [j] 的位置),如果next [j] 等于0或-1,则跳到模式串的开头字符,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某个字符,而不是跳到开头,且具体跳过了k 个字符。

按暴力匹配是这样子滴:然而可以更快一些,直接将D和E比较 T_T

当匹配失败时,j要移动的下一个位置k。存在着这样的性质:最前面的k个字符和j之前的最后k个字符是一样的。

用数学公式来表示是这样的

P[0 ~ k-1] == P[j-k ~ j-1]

void cal_next(char *str,int *next,int len)
{next[0]=-1;//-1表示不存在相同的最大前缀和最大后缀int k=-1;for(int q=1;q<len;q++){//如果下一个不同,k就变成next[k]while(k>-1&&str[k+1]!=str[q])k=next[k];//向前回溯//无论k取何值,next[k]都是小于k的if(str[k+1]==str[q])    ++k;next[q]=k;}
}

有了next数组,我们就可以来进行字符串的快速匹配啦

int KMP(char *str,int slen,char *ptr,int plen)
{int *next=new int[plen];cal_next(ptr,next,plen);//计算next数组int j=-1;for(int i=0;i<slen;i++){while(j>-1&&ptr[j+1]!=str[i]){//ptr和str不匹配,且j>-1,表示ptr和str有部分匹配j=next[j];//往前回溯}if(ptr[j+1]==str[i])j=j+1;if(j==plen-1)//j移动到ptr的末端return i-plen+1;}return -1;
}

KMP字符串搜索算法相关推荐

  1. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)

    2019独角兽企业重金招聘Python工程师标准>>> 1. 简单介绍 在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前被认为最高效的字符串搜索算法,它由Bob ...

  2. 详细讲解BM字符串搜索算法

    ①由来介绍 在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前被认为最高效的字符串搜索算法,它由Bob Boyer和J Strother Moore设计于1977年. 一般情况下, ...

  3. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一 ...

  4. kmp字符串查询算法

    kmp字符串查询算法 1 普通的字符串查询 普通的字符串查询是遍历被查找的字符串,然后和key字符串进行匹配,如果不一致,则,被查找的字符串+1,继续向下遍历. 代码如下: private stati ...

  5. java中字符串的算法_Java中的字符串搜索算法

    我正在使用大量数据进行字符串匹配. 编辑:我正在匹配一个大列表中的单词与一些本体文本文件.我从本体中获取每个文件,并搜索每个文件行的第三个字符串与列表中的任何单词之间的匹配. 我在监督这样一个事实上犯 ...

  6. KMP字符串模式匹配

    KMP 字符串基本概念 字符串 S:无特殊说明,字符串仅由26个小写字母'a'-'z',并用大写字母表示一个字符串 S="abcd" |S|:表示一个字符串的长度 |S|=4 S[ ...

  7. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的. 且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B ...

  8. 字符串搜索算法:暴力搜索,KMP

    目录 前言废话 暴力搜索 KMP算法 前言废话    最近脑子有点昏昏沉沉,喝点那种红枣泡的白酒居然神奇的好了一些,感觉很舒服.看来喝少量的酒可以让人更清醒,长期喝可能有养生的效果? 写道这里去百度了 ...

  9. Java实现算法导论中KMP字符串匹配算法

    "前缀"和"后缀". "前缀"指除了最后一个字符以外,一个字符串的全部头部组合:"后缀"指除了第一个字符以外,一个字符串 ...

最新文章

  1. opencv-python将.tif格式的图像转为png格式
  2. Know more about Oracle Latches
  3. 胜利大逃亡 三维BFS
  4. Microsoft强大团队(源代码)管理工具--TFS2010 与vs结合
  5. 浏览器登录_谷歌浏览器在Android 7.0及以上版本支持使用指纹进行无密码登录
  6. 洛谷——P1001 A+B Problem
  7. 二叉树层级遍历_二叉树中的层级顺序遍历
  8. pcb文件转成原理图_初学PCB设计,到底该学习哪款软件?
  9. 腾讯校招技术岗面试经历及总结(已发offer)
  10. 灵敏度和稳定性能兼具 新气体传感器技术适用于工业应用
  11. 拓端tecdat|Python信贷风控模型:梯度提升Adaboost,XGBoost,SGD, GBOOST, SVC,随机森林, KNN预测金融信贷违约支付和模型优化
  12. Python学习之路day01——002简单数据类型
  13. linux安装monaco字体
  14. 猝死理赔年轻化,恶性肿瘤仍为头号健康“杀手”
  15. JavaScript中document的用法
  16. R语言画森林图方法4
  17. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆
  18. 国产紫光FPGA实现DDS信号发生器
  19. laravel实现第三方登录(qq登录)
  20. 友情链接作用与方法详解

热门文章

  1. ORA-04028: cannot generate diana for object xxx
  2. BZOJ 1968 [Ahoi2005]COMMON 约数研究
  3. Qt学习之路(1)------Qt常用类用法说明
  4. 关于CRM插件调试方面事
  5. android 判断 飞行模式,如何在Android上检测飞行模式?
  6. 安卓 ce linux,手持移动数据终端的操作系统有哪些?Windows CE,Mobile和安卓各有什么优缺点?...
  7. 前端获取后端传来的session_java后台如何获取,前台传来的表单数据
  8. python函数的命名_18:命名, 变量, 代码, 函数
  9. js 对一个字段去重_JS单行、多行文本字符去重和行去重
  10. java timer 线程安全_多线程之 线程安全与控制