Knuth-Morris-Pratt 算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
个人心得:比较好理解,只要了解前缀和后缀就好了,就是代码实现得太巧妙太抽象,难以体会和想到,不得不佩服!
KMP算法的关键在于next数组的创建和子字符串的匹配;
next数组里面存放的是要查找的字符串前i个字符串的所有前缀、后缀相等的公共串中,最大的长度值。比如需要查找的一个子串ababcd,next[0]表示子串中前1个字符串即a的前缀和后缀中相等字符串的最大长度,因为a的前缀和后缀没有,故next[0] = 0;对于next[2],即先求出子串aba的前缀和后缀出来,前缀为a,ab,后缀有ba,a,相等的公共串为a,长度为1,因此next[2] = 1;依次可以求出。
void getnext(int x[],int next[])
{
int i=;
int j=-;
next[i]=-;
while(i<m)
{
if(j==-||x[i]==x[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
然后就是字符串的对比了,注意j=-1只会出现一次,以后就是每次的跳转了,根据对应的next实现代码优化
int i=,j=;
while(i<=n&&j<m)
{
if(j==-||a[i]==b[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==m) flag=;
else flag=-;
Knuth-Morris-Pratt 算法的更多相关文章
- 我所理解的 KMP(Knuth–Morris–Pratt) 算法
假设要在 haystack 中匹配 needle . 要理解 KMP 先需要理解两个概念 proper prefix 和 proper suffix,由于找到没有合适的翻译,暂时分别称真实前缀 和 真 ...
- 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解
一.前言 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...
- knuth洗牌算法
首先来思考一个问题: 设计一个公平的洗牌算法 1. 看问题,洗牌,显然是一个随机算法了.随机算法还不简单?随机呗.把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可. 如果你的答案是这样, ...
- C前序遍历二叉树Morris Traversal算法
首先来递归算法,简单易懂: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef ...
- LeetCode刷题--基础知识篇--KMP算法
KMP算法 关于字符串匹配的算法,最知名的莫过于KMP算法了,尽管我们日常搬砖几乎不可能去亲手实现一个KMP算法,但作为一种算法学习的锻炼也是很好的,所以记录一下. KMP算法是根据三位作者(D.E. ...
- 字符串匹配算法(三)-KMP算法
今天我们来聊一下字符串匹配算法里最著名的算法-KMP算法,KMP算法的全称是 Knuth Morris Pratt 算法,是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Prat ...
- Leetcode | substr()
求子串当然最经典的就是KMP算法了.brute force算法在leetcode上貌似也有一些技巧. brute force: char* StrStr(const char *str, const ...
- [LeetCode] 28. Implement strStr() 解题思路
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- KMP算法解析(转自图灵社区)
KMP算法是一个很精妙的字符串算法,个人认为这个算法十分符合编程美学:十分简洁,而又极难理解.笔者算法学的很烂,所以接触到这个算法的时候也是一头雾水,去网上看各种帖子,发现写着各种KMP算法详解的转载 ...
- 彻底弄明白之数据结构中的KMP算法
如何加速朴素查找算法? KMP,当然还有其他算法,后续介绍. Knuth–Morris–Pratt string search algorithm Start at LHS of strin ...
随机推荐
- linux 挂载 smb
smbmount //192.168.1.210/homes/dm8168 /opt/fedora/ -o username=psubo,password=psubo_smb
- 在.h和.cpp中包含头文件的区别
1.在.h中包含头文件,是为了声明一系列这个头文件的变量等,可能会产生重复包含的问题: 2.在.cpp中包含头文件只是为了实现这个头文件或者使用其中的方法,不会有重复包含的问题,所以尽量在源文件中包含 ...
- log4j2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL ...
- centos 源码安装php5.5
系统环境: CentOS 6.5 / 7.0 x86_64 Fedora 20 x86_64下载 PHP 源码包 # wget http://cn2.php.net/distributions/php ...
- 最长k可重区间集
P3358 最长k可重区间集问题 P3357 最长k可重线段集问题 P3356 火星探险问题 P4012 深海机器人问题 P3355 骑士共存问题 P2754 [CTSC1999]家园 题目描述 ...
- 【bzoj4401】块的计数(水dfs)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4401 假设把树划分为x个节点作一块,那么显然只有当x|n的时候才可能存在划分方案,并且这 ...
- hive学习1(hive基本概念)
hive基本概念 hive简介 hive是什么 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 为什么使用hive 1)简单易上手.提 ...
- super和this 在构造方法上的用法
super Super()表示调用父类的构造方法.如果没有定义构造方法,那么就会调用父类的无参构造方法,即super(). this 在构造方法中,this表示本类的其他构造方法:student(st ...
- SQL SERVER 日志已满的处理方法 (转)
事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf.在 SQL Server 7.0 和 SQL Server 2000 中,如果设置了自动增长功能,事 ...
- poj 2115 C Looooops 扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23616 Accepted: 6517 Descr ...