谈一谈我对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有所理解