KMP算法:

引言:

KMP算法是一种改进的字符串匹配算法

字符串匹配:即寻找str_target在str_source中出现的位置

没有改进的字符串匹配:用暴力法进行搜索,枚举出所有的情况然后一一比较。缺点:耗费了很多时间,时间复杂度非常高。所以需要改进。

这里举一个暴力匹配的例子:

在"zabcae"中寻找"abcab" :

KMP算法优势:

可以看到,每次出现不匹配时,i都会回溯到上一次的位置。而由于前几次比较的结果,可以避免i的回溯,并且找到一个比较好的j的位置进行比较,从而减小

许多重复的运算。

KMP中的NEXT数组:

前面说到 j 会进行回溯,而 j 应该回溯到什么地方呢?

由next[]数组来回答,具体看下图:

可以看到,NEXT[ ]数组保证了i不会回溯,并且j会回溯到较好的一个位置

NEXT[ ]数组的实现:

先给出代码:

 1 void cre_next(char * p/*模式串首地址*/,int len/*模式串长度*/) {
 2     int j = 0;
 3     int k = -1;
 4     next_[0] = -1;
 5
 6     while (j < len - 1) {
 7         if ( k==-1 || p[j]==p[k]) {
 8             next_[j + 1] = k + 1;
 9             j++;
10             k++;
11         }
12         else {
13             k = next_[k];
14         }
15
16     }
17 }

看起来一头雾水,接下来我们来一步步分析每句代码的含义。

最本质的就是  p[k]=p[j]和p[k]!=p[j]时两种情况的讨论,但经过多人的修改,变成了上面这种代码简洁的形式。

简略来说就是:

当p[k]=p[j]时,next[j+1]=k+1

当p[k]!=p[j]时,k=next[k]  然后回到第一步进行判断。

获取到next数组时实际上就完成了KMP算法的很大一部分,接下来就稍微修改下暴力破解时的代码就好了。

2019/2/15更新,未完待续。。。

转载于:https://www.cnblogs.com/virgildevil/p/10374068.html

有关字符串的算法(KMP,Manacher,BM)陆续补充相关推荐

  1. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  2. 列宽一字符等于多少厘米_字符串匹配算法总结——BF、KMP、BM

    说明 以下算法介绍中,被匹配字符串称为主串,匹配模式字符串称为匹配串,索引从0开始. 前缀数组:字符串S = AB(B !== ⏀,即B为任一非空字符串) ,S的前缀指A.前缀数组指所有包含第一个字符 ...

  3. BF、KMP、BM、Sunday算法讲解

    原文地址: https://www.cnblogs.com/Syhawk/p/4077295.html BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中 ...

  4. BMY、KMP、BM、BMHS算法性能比较

    前些日子研究了一下字符串匹配算法,突发奇想自己设计了一种新的字符串匹配算法,因为是基于BM的思想,所以暂且叫他BMY算法吧.传统的BM算法是基于坏字符规则和好后缀规则,从后向前的匹配字符串,每次发现失 ...

  5. KMP、BM、Sunday、Horspool、strstr字符串匹配算法的性能比较

    KMP.BM.Sunday.Horspool.strstr字符串匹配算法的性能比较 一.简介 简介:字符串匹配算法,顾名思义,在一个给定的字符文本内搜寻出自己想要找的一个字符串,平常所用的各种文本编辑 ...

  6. kmp算法及manacher算法分析

    1.KMP算法 kmp算法主要用来解决字符串匹配的问题,即一个字符串是否是另外一个字符串的子串. (1)暴力法 首先想到的方法就是暴力匹配法,即两个字符串按位进行匹配,如果遇到不相同的,则从从头开始的 ...

  7. kmp字符串查询算法

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

  8. python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配

    问题: 已知字符串 B 是字符串 A 的一个子串,问字符串 B 在字符串 A 的第一次出现位置. 暴力方法:从 A 字符串 的每个位置开始对字符串 B 进行匹配. 这种方法根据数据的不同 复杂度不同最 ...

  9. 字符串的模式匹配--BF算法KMP算法

    BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...

  10. 字符串算法——KMP匹配及Next数组

    KMP是单模匹配算法,即在一段长度为n的文本串中搜索一个长度为m的模式串,算法复杂度为O(n+m),差不多是这类算法能达到的最优复杂度. 朴素的模式匹配算法 在处理这类问题时,最简单的方法便是暴力匹配 ...

最新文章

  1. 刷题:二叉树的非递归遍历方式
  2. php运行cpu利用率低,PHP-如何减低php程序的cpu使用率?
  3. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
  4. 1.2.1 计算机网络的分层结构、协议、服务和接口
  5. WebSocket客户端连接断开后,服务器端的析构处理
  6. JQuery链式操作简单的菜单列表
  7. java 正则表达式使用_如何用正则表达式杀死Java
  8. d3 tip mysql_mysql
  9. CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板
  10. java事件处理机制(自定义事件)
  11. 017年美国大学生数学建模竞赛E题优秀论文解读
  12. 努比亚 N2(Nubia NX575J) 解锁BootLoader 并进入临时recovery ROOT
  13. buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
  14. easypanel b.php,easypanel 免费主机面板
  15. 概率分布 ---- 泊松分布
  16. 串口拓展测试方法及步骤--信而泰TeleATT测试软件实操
  17. 资福医疗大圣磁控胶囊胃镜硬核出镜高交会
  18. JSF Chapter11
  19. 输入现在的日期,输出明天的日期
  20. 【安全运维】小微企业的安全运维工具用哪款好?

热门文章

  1. jQuery操作DOM节点的相关方法
  2. [渝粤教育] 江苏食品药品职业技术学院 食品生物化学 参考 资料
  3. 【渝粤教育】电大中专计算机职业素养 (6)作业 题库
  4. 【RLchina第二讲】 Foundations of Reinforcement Learning
  5. 马尔可夫随机场数学原理理解
  6. C# 中的字符串内插
  7. NHibernate教程(14)--使用视图
  8. python学习第二十三节(反射以及小工具)
  9. [Linux/Unix]常用命令
  10. [转]MySQL和SQLServer的比较