有关字符串的算法(KMP,Manacher,BM)陆续补充
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)陆续补充相关推荐
- Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)
Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...
- 列宽一字符等于多少厘米_字符串匹配算法总结——BF、KMP、BM
说明 以下算法介绍中,被匹配字符串称为主串,匹配模式字符串称为匹配串,索引从0开始. 前缀数组:字符串S = AB(B !== ⏀,即B为任一非空字符串) ,S的前缀指A.前缀数组指所有包含第一个字符 ...
- BF、KMP、BM、Sunday算法讲解
原文地址: https://www.cnblogs.com/Syhawk/p/4077295.html BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中 ...
- BMY、KMP、BM、BMHS算法性能比较
前些日子研究了一下字符串匹配算法,突发奇想自己设计了一种新的字符串匹配算法,因为是基于BM的思想,所以暂且叫他BMY算法吧.传统的BM算法是基于坏字符规则和好后缀规则,从后向前的匹配字符串,每次发现失 ...
- KMP、BM、Sunday、Horspool、strstr字符串匹配算法的性能比较
KMP.BM.Sunday.Horspool.strstr字符串匹配算法的性能比较 一.简介 简介:字符串匹配算法,顾名思义,在一个给定的字符文本内搜寻出自己想要找的一个字符串,平常所用的各种文本编辑 ...
- kmp算法及manacher算法分析
1.KMP算法 kmp算法主要用来解决字符串匹配的问题,即一个字符串是否是另外一个字符串的子串. (1)暴力法 首先想到的方法就是暴力匹配法,即两个字符串按位进行匹配,如果遇到不相同的,则从从头开始的 ...
- kmp字符串查询算法
kmp字符串查询算法 1 普通的字符串查询 普通的字符串查询是遍历被查找的字符串,然后和key字符串进行匹配,如果不一致,则,被查找的字符串+1,继续向下遍历. 代码如下: private stati ...
- python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配
问题: 已知字符串 B 是字符串 A 的一个子串,问字符串 B 在字符串 A 的第一次出现位置. 暴力方法:从 A 字符串 的每个位置开始对字符串 B 进行匹配. 这种方法根据数据的不同 复杂度不同最 ...
- 字符串的模式匹配--BF算法KMP算法
BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...
- 字符串算法——KMP匹配及Next数组
KMP是单模匹配算法,即在一段长度为n的文本串中搜索一个长度为m的模式串,算法复杂度为O(n+m),差不多是这类算法能达到的最优复杂度. 朴素的模式匹配算法 在处理这类问题时,最简单的方法便是暴力匹配 ...
最新文章
- 刷题:二叉树的非递归遍历方式
- php运行cpu利用率低,PHP-如何减低php程序的cpu使用率?
- STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
- 1.2.1 计算机网络的分层结构、协议、服务和接口
- WebSocket客户端连接断开后,服务器端的析构处理
- JQuery链式操作简单的菜单列表
- java 正则表达式使用_如何用正则表达式杀死Java
- d3 tip mysql_mysql
- CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板
- java事件处理机制(自定义事件)
- 017年美国大学生数学建模竞赛E题优秀论文解读
- 努比亚 N2(Nubia NX575J) 解锁BootLoader 并进入临时recovery ROOT
- buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
- easypanel b.php,easypanel 免费主机面板
- 概率分布 ---- 泊松分布
- 串口拓展测试方法及步骤--信而泰TeleATT测试软件实操
- 资福医疗大圣磁控胶囊胃镜硬核出镜高交会
- JSF Chapter11
- 输入现在的日期,输出明天的日期
- 【安全运维】小微企业的安全运维工具用哪款好?
热门文章
- jQuery操作DOM节点的相关方法
- [渝粤教育] 江苏食品药品职业技术学院 食品生物化学 参考 资料
- 【渝粤教育】电大中专计算机职业素养 (6)作业 题库
- 【RLchina第二讲】 Foundations of Reinforcement Learning
- 马尔可夫随机场数学原理理解
- C# 中的字符串内插
- NHibernate教程(14)--使用视图
- python学习第二十三节(反射以及小工具)
- [Linux/Unix]常用命令
- [转]MySQL和SQLServer的比较