我对kmp的看法

谈一谈我对kmp的理解

Kmp的核心就是Ne[i]=j,可是算法千奇百怪,我以前写的和老师写的不一样,导致我理解不了老师的,这里就不讲述我的方法害怕误导大家。

在遇到问题时,我觉得最好的方式是可以去csdn查找,以及我们去编写一个代码,然后在这个代码中输出我想要看得到的,可能这个输出与题目无关。

A

A

A

A

C

A

A

A

A

B

0

1

2

3

4

5

6

7

8

9

这里是数组中存储的方式

然后我到编译器上运行这串模式串的ne数组内容

为什么要举这个例子呢?这里我主要是想让大家看一下,这C的ne值

Ne[9]=4的含义是什么呢?

9前面的内容(就是下面图片中的东西)

与4前面的内容(就是下面图片中的东西)

接下来,我们来对比一下,5 6 7 8是不是和0 1 2 3对应的内容是一样的啊

那么ne[9]=4是不是显而易见的表达出来了,就是9前面的字符串和4前面的字符串是一模一样的。有什么用呢?第九个位置比较失败了,那么我直接让主串和4的位置进行比较就想了,有点像父母打屁股和头一样,有一天屁股红了,打头吧。

ssss

可能还没理解,没关系,我知道我表达能力不行,上题

有点感觉了吗?

那么ne[i]=j,假如我没有编译器,如何进行搞出来,而且也不想画表格了,就拿下面的进行快速的出

由于前两个是预处理的,咱就不管了,从数组下标为2开始,从零开始数,以及从1倒着看,有没有相同的字符串啊,好像没有啊,那没事了,那只能从头开始了

数组下标3呢,倒着数以及正着看,是不是到这有个a啊,正着有个a啊,这样,所以他的下标就是匹配位置加一,这样一旦我三的位置与题目不匹配的话,就直接与一号位置进行匹配,简称打头。

好了,鄙人语文水平有限,主要是迷了一天,如果有和我一样没弄明白的同学,希望篇文章会让你对kmp有所理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值