关于KMP算法的理解
上次因为haipz组织的比赛中有道题必须用到KMP算法,因此赛后便了解了下它,在仔细拜读了孤~影神牛的文章之后有种茅塞顿开的感觉,再次ORZ。
附上链接http://www.cnblogs.com/yjiyjige/p/3263858.html。
对于整个KMP算法,最精髓的部分便是关于next数组的生成。一开始ruijia liu的书上贴上的代码感觉完全不能理解,但是看神犇的分析觉得似乎明白了什么故写下此文来理理思路。
在整理思路之前首先记住一句话:next[j]表示的是当在str2[j]!=str1[i]时,j指针应该移向的位置。
对于next[j]的还有一种理解:对于0到当前j这样一段字符串,是前缀与后缀相同长度的最大值
如对于abcab,next[5]=2,则表示当str2[5]!=str1[i]时(虽然这样的情况不可能存在,因为此时已经发现最大长度),应该直接从str[2]开始比较,因为对于当前子字符串,前缀"ab"等于后缀"ab",因此直接从j=2开始比较即可。(这种貌似要形象一点,注意是“当前字符串”)。
然后怒贴代码逐句分析(不能理解处点入链接)
void getnext()
{
next[0]=next[1]=0;// 当j=0时匹配即不成功的话自然还是应当从0开始匹配
//而1是自然应该从0开始比较无疑
for(int i=1;i<len2;i++)//牢记目标,是为了求出当i+1不能匹配时j指针应该回到的位置
{
int j=next[i];//j是临时的一个变量,暂时存放之前得到的比较结果,减少比较量
while(j&&str2[j]!=str2[i]) j=next[j];//这里便是分歧之一:当j=0时自然不用说,当j不等于零时,便更深一步与靠前的前缀进行比较,这样一是可以节省运算量,
//二是可以确定所得的next[j]是最大的,若不是最大的必然会在比较中漏比较
next[i+1]=str2[j]==str2[i]?j+1:0;//当前str[j]==str[i]的话就是当前next[j]+1;如果不想等就是0,即前缀后缀无相等的部分
}
}
在有两道题HDOJ 1711 HDOJ 1358都是基本应用,AC吧!
关于KMP算法的理解的更多相关文章
- 自己对kmp算法的理解,借由 28. 实现 strStr() 为例
做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...
- KMP算法 --- 深入理解next数组
在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...
- KMP算法的理解
---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法 ...
- 关于《数据结构》课本KMP算法的理解
数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...
- 我对KMP算法的理解
KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...
- KMP算法自我理解 和 模板
字符串 abcd abc abcd abc 匹配串 cdabcd 匹配串的 next 0 0 0 0 1 2: 开始匹配 abcd abc abcd abc cd abc d a,d 匹配失 ...
- 第十一章 串 (c3)KMP算法:理解next[]表
- kmp算法初步理解
123456789 abbdaxnds Next 01212 第三位看第二位b,第二位和第三位相同,都是b,所以第三位的next是第二位的next加1,即1+1=2 第四位看第三位b,第四位d与第 ...
- KMP算法中next函数的理解
首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...
随机推荐
- .NET Core引入日志(Log4Net篇)
Demo版本信息如下: VS:2019 框架:.Net Core 3.1 Log4Net:2.0.12 思维导图: [1]添加依赖项 通过nuget添加Log4Net [2]创建公共类 添加公共类Lo ...
- MySQL select 语句指定字段查询
指定字段查询 SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as al ...
- K8s 平台可以如何处理 Pod 预授权问题
前言 TKEx-CSIG 是基于腾讯公有云 TKE 和 EKS 容器服务开发的内部上云容器服务平台,为解决公司内部容器上云提供云原生平台,以兼容云原生.适配自研业务.开源协同为最大特点. 业务容器上云 ...
- rac双节点+物理DG
注:以下文章均是看了黄伟老师的视频,记录为博客供以后使用. 双节点RAC搭建: http://blog.csdn.net/imliuqun123/article/details/76171289 RA ...
- 攻防世界 - Misc(一)
base64÷4: 1.下载附件,是一个.txt文件,打开是一串字符, 666C61677B453333423746443841334238343143413936393945444442413234 ...
- ctfhub技能树—web前置技能—http协议—请求方式
打开靶机环境(每次打开都要30金币,好心疼啊) 题目描述为"请求方式" HTTP的请求方式共有八种 1.OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向 ...
- Ice系列--强大如我IceGrid
前言 IceGrid是一个提供服务定位和服务激活的组件,但它的功能远不止于此.从它的命名可以看出它的设计理念-网格计算(grid computing).网格计算被定义为由一系列关联的廉价计算机组成的计 ...
- AQS之ReentrantReadWriteLock写锁
用法 1.1 定义一个安全的list集合 public class LockDemo { ArrayList<Integer> arrayList = new ArrayList<& ...
- .net core 不同地区时间相互转换
.net core 不同地区时间相互转换 //韩国时间转换成当前时间 //value=需要转换的时间 //Korea Standard Tim 韩国时间 //China Standard Time 中 ...
- git的使用学习笔记3---关于项目分支创建克隆拉取推送
一.创建项目 1.打开官网 2.填写相关内容 查看新创建的项目 3.选择方式 4.在git上新建文件夹 1)克隆: mkdir workspace 将代码克隆到本地,取本地配置的.ssh的文件 git ...